Ошибка объекта Java Timer: таймер уже отменен - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть 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 голосов
/ 29 ноября 2018

Я думаю, что метод "отмена" на таймере все еще сохраняет запланированное задание в состоянии отмены.Вызов метода «очистки» сразу после отмены должен очистить очередь и, возможно, решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...