使用定时器倒计时

时间:2012-08-18 22:42:44

标签: java swing timer

尝试编写一个计时器来进行倒计时(如火箭发射: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();
}

2 个答案:

答案 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;

每次在行动中执行以便计数器永远不会结束。

您需要将其移至班级并在启动计时器之前将其初始化。