package GUI;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import java.util.*;
/**
*
* @author Zhu Zhengyan
*/
public class My_GUI6 {
public static void main(String[] args)
{
EventQueue.invokeLater(()->{
JFrame frame = new MouseFrame();
frame.setTitle("mouse");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
class MouseFrame extends JFrame
{
public MouseFrame()
{
add(new MouseComponent());
pack();
}
}
class MouseComponent extends JComponent
{
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
private static final int SIDELENGTH = 10;
private ArrayList<Rectangle2D> squares; //Rectangle2D类型的数组列表
private Rectangle2D current;
public MouseComponent() //构造方法
{
squares = new ArrayList<>();
current = null;
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
}
public Dimension getPreferredSize() //重写getPreferredSize方法,获取组件的首选大小
{
return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
public void paintComponent(Graphics g) //重写绘制组件的方法
{
Graphics2D g2 = (Graphics2D)g;
for(Rectangle2D r:squares)
g2.draw(r);
}
public Rectangle2D find(Point2D p) //遍历长方形,检查鼠标按压点是否在长方形内,若在,就返回原长方形;若都不在,返回null
{
for(Rectangle2D r:squares)
{
if(r.contains(p))
return r;
}
return null;
}
public void add(Point2D p) //参数为当前鼠标的坐标,产生一个新的长方形储存在数组中,由PaintComponent方法绘制
{
double x= p.getX();
double y =p.getY();
current = new Rectangle2D.Double(x - SIDELENGTH/2,y - SIDELENGTH/2,SIDELENGTH,SIDELENGTH);
squares.add(current);
repaint(); //每调用一次repaint就重新绘制画布
}
public void remove(Rectangle2D s)
{
if(s == null)
return;
if(s == current)
current = null;
squares.remove(s); //Arraylist方法,删除该元素的第一次出现(即删除该长方形)
repaint();
}
private class MouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent event) //按压鼠标,先调用find方法判断鼠标位置,若不在长方形内,调用add方法
{
current = find(event.getPoint());
if(current == null)
add(event.getPoint());
}
public void mouseClicked(MouseEvent event)
{
current = find(event.getPoint());
if(current != null && event.getClickCount() >= 2) //如果鼠标在长方形内,点击次数>=2次,就调用remove方法
remove(current);
}
}
private class MouseMotionHandler implements MouseMotionListener
{
public void mouseMoved(MouseEvent event) //判断鼠标位置,设置光标形状
{
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();
current.setFrame(x - SIDELENGTH/2,y - SIDELENGTH/2,SIDELENGTH,SIDELENGTH);//
repaint();
}
}
}
}
鼠标事件
最新推荐文章于 2024-04-25 23:02:53 发布