图形对象上的MouseListener

Tru*_*Bún 1 java graphics swing java-2d mouselistener

我感觉非常愚蠢.但是为什么这段简单的代码不会改变椭圆的颜色呢?

基本上我想在椭圆上添加一个鼠标监听器 - 一个图形对象.当鼠标光标为椭圆形时,椭圆会改变其颜色.但是这段代码根本没有改变......这段代码仅供测试.

public class Help extends JFrame{

    public static void main(String [] agrs){
        Help h = new Help();
        h.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        h.add(new Help_Option());
        h.setSize(2000, 1000);
        h.setVisible(true);
    }
}

class Help_Option extends JComponent implements MouseListener{
    Ellipse2D ellipse = new Ellipse2D.Double(0, 0, 1000, 500);
    Color c = Color.BLACK;    

    public Help_Option(){
        this.addMouseListener(this);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.setColor(Color.BLUE);
        g2d.draw(ellipse);

        g2d.setColor(c);
        g2d.fill(ellipse);        
    }

    public void setColor(Color c){
        this.c = c;
    }

    @Override
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {
        if (ellipse.contains(e.getX(), e.getY()) ) {
            setColor(Color.GREEN);
            repaint();
        }
    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}
Run Code Online (Sandbox Code Playgroud)

Sil*_*eak 5

你正在添加一个MouseListener等待mouseEntered事件.当鼠标进入Component而不是它的区域时会触发这些.尝试进入显示椭圆的组件边界并观察.

你需要的是一个MouseMotionListener,这样你就可以逐个像素地观察鼠标; 使用mouseMovedmouseDragged事件.

您可能仍然需要监听mouseEnteredmouseExited事件,因为MouseMotionEvents仅在组件边界内被触发,因此您可能会在仍在椭圆内部时遗漏退出组件的鼠标.

调试它的一种简单方法是在事件处理程序中添加打印.然后,您将看到处理程序被调用,但只有一次或几次,而不是在组件中移动鼠标时.


class Help_Option extends JComponent implements MouseListener, MouseMotionListener {
    Ellipse2D ellipse = ...;

    public Help_Option() {
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }

    public void mouseMoved(MouseEvent e) {
        if (ellipse.contains(e.getX(), e.getY()) ) {
            //mouse is inside the ellipse
        } else {
            //mouse is outside the ellipse
        }
    }

    public void mouseExited(MouseEvent e) {
        //mouse is outside the ellipse
    }

    //more method stubs
}
Run Code Online (Sandbox Code Playgroud)


And*_*son 5

..如果我使用椭圆的边界,它将是一个矩形,所以每当我的鼠标进入矩形但不是椭圆形时,颜色会改变

看到:

有关2个形状之间碰撞的演示,请参阅此答案.