【问题标题】:MouseListener on a graphics object图形对象上的 MouseListener
【发布时间】:2014-04-15 11:58:56
【问题描述】:

我觉得自己很愚蠢。但是这段简单的代码为什么没有改变椭圆的颜色呢?

基本上我想给椭圆添加一个鼠标监听器——一个图形对象。当鼠标光标处于椭圆形时,椭圆形会改变其颜色。但是这段代码根本没有改变……这段代码只是为了测试。

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

    }
}

【问题讨论】:

  • 您遇到了哪个错误?
  • 没有错误!但它不会改变颜色...
  • 你是什么意思,“根本不运行”?编译器是否给出错误(哪个?),程序是否给出异常(哪个?),或者它根本没有做任何事情?
  • 哦,对不起!我要换个帖子了!

标签: java swing graphics java-2d mouselistener


【解决方案1】:

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

【讨论】:

  • 但是如果我使用椭圆的边界,它将是一个矩形,所以每当我的鼠标进入矩形但不是椭圆的时候,颜色就会改变......这不是什么我真的很想……
  • 嗯,它适用于鼠标运动监听器。但我很好奇,你可以看看这个stackoverflow.com/questions/4634107/…我做了同样的事情但是....
  • 他们在等待点击,所以这不完全一样。他们不必检测鼠标进入或退出椭圆,而只需知道它是否在特定点的内部。我添加了一些代码来说明检测可能如何工作
【解决方案2】:

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

见:

另请参阅this answer 以获取演示 2 个形状之间的碰撞的演示。

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多