MouseMotion传感器方法调用

时间:2010-04-28 00:54:07

标签: java mouseevent

我遇到了一个问题,无论我多长时间研究类和超类的API,我都想不出来。

假设我想设计一种游戏,其中鼠标运动控制用于反弹球的块的运动,然后销毁多色砖。

你如何专门让这个块“听”鼠标? 以下代码是我试图获得预期结果的代码。

/** Breakout Program*/
public class Breakout extends GraphicsProgram implements MouseMotionListener {


...
 /** The Paddle Itself */
    private GRect paddle = new GRect(0, HEIGHT-PADDLEBOTTOM_OFFSET, PADDLEWIDTH, PADDLEHEIGHT);
...

    /** Run the Breakout program. */
    public void run() {

        paddle.setFillColor(Color.BLACK);
        paddle.setFilled(true);

        add(paddle);
        paddle.addMouseListener(this);

        ...

    }



   /** Move the horizontal middle of the paddle to the x-coordinate of the mouse position -
      * -but keep the paddle completely on the board. */ 
    public void mouseMoved(MouseEvent e) { 
        GPoint p= new GPoint(e.getPoint());
        double x = p.getX();
        paddle.setLocation(x, HEIGHT-PADDLEBOTTOM_OFFSET);

        }

}

任何关于为什么/我做错误的做法的澄清都会有所帮助,谢谢。

4 个答案:

答案 0 :(得分:1)

您的类已设置为用作鼠标侦听器 - 您只需要告诉某些组件向您发送MouseEvents。为了做到这一点,你需要实现你已经完成的MouseMotionListener,所以你大部分都在那里。

剩下要做的就是在你的JFrame,JDialog或你正在使用的任何窗口上调用方法addMouseMotionListener(this)

将来,为了保持代码的正确性,可能需要设置一个单独的类作为监听器;最常见的解决方案称为匿名内部类,您可能需要Google。但随着你的截止日期临近,你所得到的将会很好。

答案 1 :(得分:0)

mouseMoved()更新paddle位置后,您通常会在显示组件上调用repaint()GraphicsProgram对此有何看法?

答案 2 :(得分:0)

看起来所有类都属于您的应用程序,因此我猜您正在使用AWT或Swing。

尝试在球拍上调用repaint()。

答案 3 :(得分:0)

对“Etaoin”的额外评论,当你有时间并且如果你认真做好OO时,请在OO中搜索“is-a”和“has-a”关系。

如果“is-a”关系成立(苹果“is-a”果实)那么它合法使用该类的implements,否则如果它是“有一个”关系(a汽车“有一个”轮子,但汽车“不是一个”轮子然后implements是不合适的 - 你需要使用组合,换句话说,一个成员变量上课。

在您的代码中,您是否可以说Breakout类“是”MouseMotionListener?答案是“不”,BTW! Breakout“是一个”游戏,或者是一个应用程序,但MOuseMotionListener是实现的一部分

正如“Etaoin”所说,你应该将MouseMotionListener实现为一个内部类,虽然我更喜欢私有内部类,而不是匿名类(以保持构造函数的简洁和重点,以及其他原因)。

当你“获得”OO时,它的伟大而且非常强大,但却真正努力使程序化思维的“范式转变”。