你能用Java取消特定的TimerTask吗?

时间:2016-03-25 03:30:42

标签: java swing timer

我正在创建一个游戏,如果你在计时器到达零时没有达到某个点,游戏结束。它目前有效,我可以一次创建多个TimerTasks,但我无法取消它们。目前,单击该按钮将重置计时器(在显示屏上),但仍将在后台运行并在程序达到零时结束程序(即使程序不应运行)。这是启动每个计时器的ActionListener的代码。

public class Game implements Runnable {

    private int currentScore, difficulty, level, highscore, x, y;
    private boolean playMusic, playClicks, gameRunning;
    private boolean stopLastTimer = false;
    JFrame gameFrame;
    Data data;
    JButton target;
    Thread t;
    JLabel score;
    Timer globalTimer = new Timer();
    JLabel timer;

    ActionListener clickedAction = new ActionListener(){
            public void actionPerformed(ActionEvent ae) {
               stopLastTimer = true;
               t.interrupt(); 
               currentScore++;
               score.setText("Score: " + currentScore);
               //playClickSound();
               globalTimer.schedule(new TimerTask(){

                   double second = 2.0;
                   @Override
                   public void run() {
                       second = second - 0.1;
                        if(stopLastTimer) { 
                        this.cancel(); stopLastTimer = false; } //should end old timer here
                        if(second == 0.0) {
                        this.cancel();
                        gameStop();
                       }
                       second = limitPrecision(Double.toString(second), 1);
                    timer.setText(second + "s");
                   }   
               },0, 100);

            }
        };

1 个答案:

答案 0 :(得分:2)

不要使用TimerTask。

相反,您应该使用javax.swing.Timer作为动画。 Swing Timer有一个stop()方法。

ActionEvent的来源将是Timer本身。

阅读How to Use Timer上Swing教程中的部分,了解更多信息和工作示例。