我感觉很傻。但是,为什么这段简单的代码不改变椭圆的颜色是什么原因呢?

基本上,我想将鼠标侦听器添加到椭圆形-图形对象。当鼠标光标位于椭圆形时,椭圆形会更改其颜色。但是这段代码根本不会改变...该代码仅用于测试。

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) {

    }
}

最佳答案

您正在添加MouseListener并等待mouseEntered事件。当鼠标进入Component而不是其区域时,将触发它们。尝试输入显示椭圆的组件边界并观察。

您需要的是MouseMotionListener,以便您可以逐个像素观察鼠标。使用mouseMovedmouseDragged事件。

您可能仍需要侦听​​mouseEnteredmouseExited事件,因为MouseMotionEvent仅在组件边界之内触发,因此您可能会错过在椭圆形内部退出组件的鼠标。

调试此错误的一种好方法是在事件处理程序中添加打印内容。然后,您将看到只调用了一次或几次处理程序,而不是在组件内移动鼠标时调用了该处理程序。



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
}

07-26 07:11