鼠标事件

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();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值