Java Timer对象错误:计时器已取消

时间:2018-11-29 19:58:40

标签: java swing timer

我有一个JButton,当按下它时,它会启动一个倒数计时器。当我按下按钮时,它开始,然后再按一次(按钮将显示“停止”),则它停止。但是,当我再次按下它以重新开始计时时,我收到一条错误消息:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Timer already cancelled.

这是我的代码:

    final static Timer t = new Timer();

    static void startTimer(JButton b) {

         t = new Timer(); // Solved: I needed to create a new Timer object.

         t.scheduleAtFixedRate(new TimerTask() { 

            double timeleft = calcShutterSpeed;

            @Override
            public void run() {
                String s = secondsToMinutes(timeleft);
                time.setText(s);
                timeleft--;
                if (timeleft < 0) {
                    t.cancel();
                    b.setText("START TIMER");
                    b.setForeground(Color.BLACK);
                }
            }
        }, 0, 1000);
    }

    static void stopTimer() {
        t.cancel();
    }

    /**
     * Creates the timer if "Start" is pressed.
     * 
     * @param b
     */
    static void timer(JButton b) {
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                // If start button is pressed, change text to display stop
                if (b.getText() == "START TIMER") {
                    startTimer(b);
                    b.setText("STOP TIMER");
                    b.setForeground(Color.RED);
                }
                // If stop button is pressed, cancel timer and change text to start
                else if (b.getText() == "STOP TIMER") {
                    stopTimer();
                    b.setText("START TIMER");
                    b.setForeground(Color.BLACK);
                }
            }
        });
    }

任何可以解决此问题的提示或建议,将不胜感激。预先感谢!

编辑:对好奇心真的很简单的修复。该修补程序在代码中。

1 个答案:

答案 0 :(得分:0)

我认为计时器上的“取消”方法仍然使计划任务处于取消状态。 在取消之后立即调用“清除”方法应该可以清理队列并可能解决此问题。