尝试编写一个计时器来进行倒计时(如火箭发射:3-2-1-Go)。我所拥有的似乎只执行一次。我需要它重复(几乎递归地)执行,直到值达到0.
正如您将看到的,我有各种println语句来跟踪这一进展。这是我的输出:
在Coundown构造函数中 在ActionListener中
倒计时
3
错误的是我错过了以下输出:
2
1
开始
这表明这个计时器实际上并没有倒计时。它似乎在等待一秒然后终止。
如何在定时器达到零之前调用它?谢谢!
public class StopWatch {
JFrameMath myTest;
int seconds;
/* Constructor */
public StopWatch(JFrameMath thisTest, int sec) {
myTest = thisTest;
seconds = sec;
myTest.hideTestButtons(true);
Countdown display = new Countdown(myTest);
}
}
class Countdown extends JFrame implements ActionListener {
private Timer myTimer = new Timer(250, this);
JFrameMath myTest;
public Countdown(JFrameMath thisTest) {
System.out.println("in Coundown constructor");
myTimer.setInitialDelay(1150);
myTest = thisTest;
myTimer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("in ActionListener");
int countSeconds = 3;
if(countSeconds == 0) {
myTest.showTimeRemaining("Go");
myTimer.stop();
System.out.println("done");
} else {
System.out.println("counting down");
myTest.showTimeRemaining(""+countSeconds);
countSeconds--;
}
myTimer.stop();
myTest.hideTestButtons(false);
}
}
public void showTimeRemaining(JFrameMath thisTest, String numSec) {
System.out.println(numSec);
lblCountdown.setText(numSec);
thisTest.pack();
}
答案 0 :(得分:6)
从myTimer.stop()
末尾删除 actionPerformed
。这就是阻止它触发后续事件的原因。您要拨打stop
的唯一地方是if (countSeconds == 0)
。
此外,我不知道这是一个拼写错误还是测试,但你需要从int countSeconds = 3;
删除actionPerformed
行。
答案 1 :(得分:5)
首先,你要在第一次通过时停止计时器:
myTimer.stop(); <---- remove this call
myTest.hideTestButtons(false);
所以永远不会再调用你的计时器。
解决了这个问题后,你正在初始化
int countSeconds = 3;
每次在行动中执行以便计数器永远不会结束。
您需要将其移至班级并在启动计时器之前将其初始化。