你如何以正确的方式使用鼠标监听器?

时间:2014-06-28 21:38:23

标签: java swing mouseevent

我希望能够点击圆圈,它会更改位置并更改圆圈。我不确定如何实现鼠标监听器。

有没有办法将鼠标监听器放在一个新的类中,它会改变x和y的位置,并改变颜色?

  class drawCircle extends JPanel{    

    int x = 70;
    int y = 70;
    int dx = 0;
    int dy = 0;

 drawCircle(){
    addMouseMotionListener(new MouseMotionAdapter(){
        public void mousePressed(MouseEvent e){

            x = (int)(Math.random()*getWidth() - 70);
            y = (int)(Math.random()*getHeight() - 70);
            repaint();
          }

    });
}   


protected void paintComponent(Graphics g){
super.paintComponent(g);

    int red = (int)(Math.random()*255);
    int blue =(int)(Math.random()*255);
    int green = (int)(Math.random()*255);

    Color color = new Color(red,blue,green);

    g.setColor(color);
    g.fillOval(x + dx, y +dy, x + dx, y + dy);
    g.drawString(" ", x + dx, y + dy);


}

}

2 个答案:

答案 0 :(得分:4)

我会使用“可点击”的东西,例如Ellipse2D对象,因为像所有实现Shape的类一样,它有一个contains(...)方法,可用于决定是否已点击任何圆圈on,可以通过将paintComponent的Graphics参数转换为Graphics2D然后调用其fill(Shape s)方法,将Ellipse2D对象传入其中来轻松绘制。

答案 1 :(得分:3)

对于更高级的实施,您可以查看Playing With ShapesShapeComponent类允许您创建一个可以支持MouseListener的实际组件,因此很容易响应MouseEvents。

您不应该在paintComponent()方法中设置圆的(随机)颜色。只要Swing确定需要重新绘制组件,就会调用paintComponent()方法。因此,颜色可能会在没有任何用户交互的情相反,应该使用setForeground(...)方法设置圆圈的颜色。然后绘画代码可以使用圆{。{1}}方法。

此外,每当您进行自定义绘制时,您都需要覆盖getForeground()方法来设置组件的大小,以便它可以与布局管理器一起使用。有关详细信息,请阅读Custom Painting上的Swing教程中的部分。