我正在创建一个游戏,如果你在计时器到达零时没有达到某个点,游戏结束。它目前有效,我可以一次创建多个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);
}
};
答案 0 :(得分:2)
不要使用TimerTask。
相反,您应该使用javax.swing.Timer
作为动画。 Swing Timer有一个stop()
方法。
ActionEvent的来源将是Timer本身。
阅读How to Use Timer上Swing教程中的部分,了解更多信息和工作示例。