【问题标题】:Why does my timer event start triggering faster and faster every time I start it again?为什么每次我重新启动它时,我的计时器事件开始触发的速度越来越快?
【发布时间】: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 exampleShort, 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


【解决方案1】:

但我可以看到箭头每次移动的速度越来越快。

这告诉我你有多个计时器正在执行。

每次单击按钮时,您当前的代码都会创建一个新的计时器。

timer.isRunning() 检查永远不会为真,因为您刚刚创建了一个新的计时器,由于您尚未启动它,它不会运行。

因此,您的旧 Timer 可能仍在运行,但由于您不再引用它,因此无法停止它。

解决办法:

不要在每次单击按钮时都创建一个新的 Timer 对象。 Timer 对象应该在类的构造函数中创建。然后您只需根据需要启动/停止计时器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2011-09-28
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多