【发布时间】:2015-09-10 16:45:55
【问题描述】:
我需要一个计时器用于我正在构建的游戏,它的基本作用是触发一个事件,当我点击播放时每秒移动和对象一个方块。现在要么让游戏顺其自然(游戏结束或物体移动出界),要么再次按下播放,计时器似乎正在触发物体比以前更快地移动等等,每次都越来越快我重新开始计时。
private void playButtonMouseClicked(java.awt.event.MouseEvent evt) {
/*code*/
timer = new Timer(timerSpeed, new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
/*code that ends with something that calls timer.stop()*/
}
}
});
if(timer.isRunning()) //in case I don't let the game stop the timer
timer.stop();
timer.start();
}
我检查了timer.getDelay() 并且延迟没有改变,它保持不变,但我可以看到箭头每次移动得越来越快。我正在使用 jPanels 和带有和图标的标签来显示网格和移动对象。
有什么想法吗?
【问题讨论】:
-
如需尽快获得更好的帮助,请发帖minimal reproducible example 或Short, Self Contained, Correct Example。
-
我的猜测 - 您正在向按钮添加越来越多的 MouseListener,而实际上您应该向 JButton 添加一个 ActionListener,并且只添加一次。
-
不要在每次点击按钮时都创建一个新的 Timer 对象。 Timer 对象应该在类的构造函数中创建。然后您只需根据需要启动/停止计时器。也许你的代码中有一个 bug 并没有像你期望的那样停止 Timer,所以下次你点击按钮时,你有多个 Timer 正在运行。
-
@Lucian 他只是猜测(“我的猜测...”) - 只要你不发布minimal reproducible example,他就无法知道。 (因此他可能无法准确告诉您在哪里添加更多鼠标侦听器(如果您是的话)。
-
就像@camickr 上面评论的那样,每次单击按钮时,我都会创建一个新的 Timer 对象,这就是我的问题的原因。我从我的代码中删除了
timer = new Timer(timerSpeed, new ActionListener()部分并在构造函数中初始化了计时器,同时添加了动作侦听器,然后我就像以前一样在我的方法中重新启动了计时器。感谢您的帮助,但欢迎您将解决方案写成答案,以便您获得荣誉。
标签: java performance swing timer delay