JavaFX - 无法取消计时器

时间:2016-05-03 18:56:11

标签: java javafx timer

我遇到的问题是每次按下“单人游戏”按钮,启动Snake游戏时,GameTimer类的新实例初始化,问题是当我点击“返回”按钮时stopTimer方法无法取消或停止计时器,它只是忽略它。计时器功能运行良好,但它非常无效,简单地说是愚蠢的。

问题:stopTimer()方法不会取消计时器。

这是我在github上的项目: https://github.com/AquaSolid/JavaFX_Snake/blob/master/src/Snake/GameTimer.java

...code omitted..  
public void stopTimer() {
    timerTask.cancel();
    timer.cancel();
    timer.purge();

    isActive = false;
} ...code omitted..  

1 个答案:

答案 0 :(得分:2)

您的代码完美无缺。但是:

  1. 停止计时器时,不要将秒计数器重置为零。这就是为什么看起来定时器一直在运行的原因。
  2. 你实际上并没有停止你的主游戏线程,所以它会在后台运行并运行并运行,一遍又一遍地重置游戏板。
  3. 确保对多线程类使用volatile变量或/和同步。
  4. 确保您知道哪个actionBackToMenu被称为按钮操作方法。
  5. 不要在多个地方使用相同的调试信息(例如"从说明书返回菜单")
  6. 在销毁阶段引用按钮(或实际上任何视觉元素)是不安全的。
  7. 在某些情况下会产生NullPointerException:

    Stage stage = (Stage) buttonBackToMenu.getScene().getWindow();
    

    这将有效:

    Node target = (Node) event.getTarget();
    Stage stage = (Stage) target.getScene().getWindow();
    
    1. 或者实际上 - 零:使用设计模式。特别是在训练期间(当你在宇宙中有所有的时间)。
    2. 祝你好运。

      P.S。如果你愿意,我可以将固定版本上传到Git。