Java 使用计时器倒计时

Java 使用计时器倒计时,java,swing,timer,Java,Swing,Timer,试图写一个计时器来倒计时(就像火箭发射:3-2-1-Go)。我所拥有的似乎只执行了一次。我需要它反复(几乎递归地)执行,直到值达到0 正如您将看到的,我有各种println语句来跟踪这个过程。以下是我的输出: 在下构造函数中 在ActionListener中 倒计时 三, 问题在于我缺少以下输出: 二, 一, 去 这向我表明这个计时器实际上并没有倒计时。它似乎在等待一秒钟,然后终止 我怎样才能让它自己调用,直到计时器达到零?谢谢大家! public class StopWatch {

试图写一个计时器来倒计时(就像火箭发射:3-2-1-Go)。我所拥有的似乎只执行了一次。我需要它反复(几乎递归地)执行,直到值达到0

正如您将看到的,我有各种println语句来跟踪这个过程。以下是我的输出:

在下构造函数中

在ActionListener中

倒计时

三,

问题在于我缺少以下输出:

二,

一,

这向我表明这个计时器实际上并没有倒计时。它似乎在等待一秒钟,然后终止

我怎样才能让它自己调用,直到计时器达到零?谢谢大家!

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();
}

首先,您在第一次通过时停止计时器:

myTimer.stop(); <---- remove this call
myTest.hideTestButtons(false);
每次执行操作时,计数器将永不停止


您需要将其移动到类级别并在启动计时器之前对其进行初始化。

从执行的
操作的末尾删除
。这就是阻止它触发后续事件的原因。要调用
stop
的唯一位置是
if(countSeconds==0)
内部


另外,我不知道这是一个打字错误还是一个测试,但是你需要删除
intcountseconds=3
actionPerformed

计时器的完整类型是什么?@João:可能
javax.swing.Timer
对不起,我没有看到这个。我有一个import javax.swing.*但是没有其他东西可以进一步识别这种类型,它必须是javax.swing.Timer,正如Mechanical snail所说的。谢谢!这是问题的一部分。谢谢,就是这样。现在,我在输出控制台中获得了正确的输出,但这还不能正常工作。首先,输出不是像我需要的那样被一秒钟分开。第二,也是更重要的一点,我的JLabel没有反映递减的输出。它从“3”开始,一直保持到消失。有什么想法吗?再次感谢!1) 如果希望以1秒的延迟触发事件,则需要在
计时器
构造函数中定义
1000
的中间延迟,即
新计时器(1000,this)
。请注意,
setInitialDelay
只是初始延迟,而不是中间延迟;2) 也许你把它藏在别的地方了,从我看到的代码来看,一切都很好。再次感谢。我的计时器最初设置为250。现在,我可以看到输出以1秒的间隔生成。然而,使用此计时器的全部目的是更新JFrame上的标签。正在发生的是,最后一行myTest.hideButtons()在计时器完成之前执行!我使用定时器的唯一目的是将这条线延迟到其他所有东西运行之后。我一直在读关于这些计时器的书,但显然我不知道如何正确使用它们。你能看到我需要做什么吗?再次感谢,我感谢你的帮助!不要介意。我想出来了。最后我不得不把那条线移到计时器里。我没有仔细考虑线程的含义。谢谢你的帮助。我很感激。
int countSeconds = 3;