线程中的MouseMotionListener

时间:2014-04-27 06:18:00

标签: java multithreading swing mouselistener

我是Java新手,现在我正在尝试理解Threads。

我目前正在制作一个"让球反弹或者你输了#34;游戏。

在这个游戏中,有一个球可以反弹墙壁"或者是一个" Girder"。

墙移动光标的x位置。没有运动。

现在我无法使用Timer,因为如果我这样做,我会对MouseMotion和Ball Movement有相同的延迟。

我想要达到的目标是获得延迟10毫秒的鼠标运动信息以及延迟200毫秒的球运动。

使用Timer我必须选择墙壁和球的延迟。 10ms非常适合墙壁移动,因为当我移动鼠标时它会立即移动,但它对于移动球来说太快了。甚至连查克诺里斯都不能快速移动鼠标让球从墙上反弹。

我尝试创建2个不同的计时器,但它不会接受鼠标监听器。 ActionListenerTimer接受的唯一监听器,但由于某种原因,如果我使用带有actionPerformed的单个计时器,它仍会触发this方法旁边的鼠标移动方法参数。但这给了我同样的球和墙延迟。

这就是为什么我需要线程来做它。但我不知道如何在MouseListener内从paintComponentThread获取鼠标移动信息。

我希望你们能理解我的问题。

编辑:

这就是我现在试图获得10毫秒的墙延迟和200毫秒的球延迟:

private Timer trigger = new Timer(200, this);
private Timer wall = new Timer(10, this);
paintComponent中的

if ((start.getText() == "Spiel aktiv..." || trigger.isRunning() == true) || wall.isRunning() == true) {
g.setColor(new Color(255, 254, 102));
g.fillRect(x, screen.getHeight() - 15, length, 10);
}

if ((start.getText() == "Spiel aktiv..." || trigger.isRunning() == true) && wall.isRunning() == false) {

        ball_x = ball_x + dx;
        ball_y = ball_y + dy;

        if (ball_x > (screen.getWidth() - 100) || ball_x < 10) {
        dx = -dx;
        bounce = true;

    }

        if (ball_y > (screen.getHeight() - 115) || ball_y < 10) {
        dy = -dy;
        bounce = true;

    }
    }

    g.setColor(new Color(103, 104, 255));
    g.drawRect(ball_x, ball_y, 100, 100);
    g.setColor(new Color(255, 254, 102));
    g.fillOval(ball_x, ball_y, 60, 60);


    }

}

在actionPerformed我启动墙并在用户点击开始时触发(球)计时器。

但我不能让球和墙上的计时器分开工作。墙上的计时器更快,并完成重绘,但我只是想让它重新粉刷墙而不是球。

1 个答案:

答案 0 :(得分:1)

像往常一样添加你的监听器(Maus扩展MouseMotionAdapter)而不需要任何额外的线程。 Event Dispather Thread用于处理鼠标事件。

使用javax.swing.Timer任意所需的延迟只是为了改变球的位置。

相关问题