我有一个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);
}
}
});
}
任何可以解决此问题的提示或建议,将不胜感激。预先感谢!
编辑:对好奇心真的很简单的修复。该修补程序在代码中。
答案 0 :(得分:0)
我认为计时器上的“取消”方法仍然使计划任务处于取消状态。 在取消之后立即调用“清除”方法应该可以清理队列并可能解决此问题。