java事件监听键盘移动方块_Java简单图形编辑器 放置、移动和擦除方块 鼠标事件测试程序 Java核心技术 事件处理...

本文介绍了一个使用Java实现的图形编辑器,支持鼠标操作来放置、移动和删除方块。通过监听鼠标事件,实现对图形的交互。示例代码包括MousePanel类,它包含了添加、删除和拖动方块的功能。
摘要由CSDN通过智能技术生成

Java简单图形编辑器 放置、移动和擦除方块 鼠标事件测试程序 Java核心技术 事件处理

source code:

package com.sunnyykn.chapter08;

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import java.awt.geom.*;

import javax.swing.*;

/**

*

* A panel with mouse operations for adding and removing squares.

* @author sunnyykn

*

*/

class MousePanel extends JPanel

{

private static final int SIDELENGTH = 10;

private ArrayList squares;

private Rectangle2D current;

//the square containing the mouse cursor

public MousePanel()

{

squares = new ArrayList();

current = null;

addMouseListener(new MouseHandler());

addMouseMotionListener(new MouseMotionHandler());

}

public void paintComponent(Graphics g)

{

super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;

//draw all squares

for (Rectangle2D r : squares)

g2.draw(r);

}

/**

* Finds the first square containing a point

* @param p a point

* @return the first square that contains p

* @author sunnyykn

*

*/

public Rectangle2D find(Point2D p)

{

for (Rectangle2D r : squares)

{

if (r.contains(p)) return r;

}

return null;

}

/**

* Add a square to the collection

* @param p the centre of the square

* @author sunnyykn

*

*/

public void add(Point2D p)

{

double x = p.getX();

double y = p.getY();

current = new Rectangle2D.Double(

x - SIDELENGTH / 2,

y - SIDELENGTH / 2,

SIDELENGTH,

SIDELENGTH);

squares.add(current);

repaint();

}

/**

* Removes a square from the collection

* @param s the square to remove

* @author sunnyykn

*

*/

public void remove(Rectangle2D s)

{

if (s == null) return;

if (s == current) current = null;

squares.remove(s);

repaint();

}

private class MouseHandler extends MouseAdapter

{

public void mousePressed(MouseEvent event)

{

// add a new square if the cursor isn't inside a square

current = find(event.getPoint());

if (current == null)

add(event.getPoint());

}

public void mouseClicked(MouseEvent event)

{

//remove the current square if double clicked

current = find(event.getPoint());

if (current != null && event.getClickCount() >= 2)

remove(current);

}

}

private class MouseMotionHandler implements MouseMotionListener

{

public void mouseMoved(MouseEvent event)

{

//set the mouse cursor to cross hairs if it is inside

//a rectangle

if (find(event.getPoint()) == null)

setCursor(Cursor.getDefaultCursor());

else

setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));

}

public void mouseDragged(MouseEvent event)

{

if (current != null)

{

int x = event.getX();

int y = event.getY();

//drag the current rectangle to center it at (x,y)

current.setFrame(

x - SIDELENGTH / 2,

y - SIDELENGTH / 2,

SIDELENGTH,

SIDELENGTH);

repaint();

}

}

}

}

/**

* A frame containing a panel for testing mouse operations

* @author sunnyykn

*

*/

class MouseFrame extends JFrame

{

public static final int DEFAULT_WIDTH = 300;

public static final int DEFAULT_HEIGHT = 200;

public MouseFrame()

{

setTitle("MouseTest Sunnyykn");

setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);

//add panel to frame

MousePanel panel = new MousePanel();

add(panel);

}

}

public class MouseTest {

public static void main(String args[])

{

MouseFrame frame = new MouseFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值