java - 图形对象上的 MouseListener

标签 java swing graphics 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) {

    }
}

最佳答案

您正在添加 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
}

关于java - 图形对象上的 MouseListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23083057/

相关文章:

java - HashMap 上的 NegativeArraySizeException

Java SQL 100 万行

java - 图形界面java插入图像空间

java - 安装河马 CMS : NullPointerException with essentials webapp

java - 如何使用 Comparator 类来处理 double 对象的数据标记?

java - 如何根据以前的单元格值更改 JTable 的单元格背景?

java - 基于 jtextfield 过滤 JTable 不区分大小写 (Java)

Java 键绑定(bind)到相同的操作

graphics - 如何制作Photoshop描边效果?

iphone - 从 CAShapeLayer 获得真正糟糕的性能