如何制作CountDown计时器Java

时间:2016-12-06 16:12:50

标签: java timer countdown

我正在开发这个小应用程序。在JFrame中,我有3个JSpinner来选择小时,分钟和秒。此外还有一个JButton来开始时间。当我按下它时应该倒数我使用JSpinners选择的时间。有一个JLabel显示CountDown时间。我在StackOverFlow中搜索了很多帖子但没有帮助我。这是我在帖子中找到的代码,它根本不起作用。谁能请帮忙???

private void countDownTimer() throws InterruptedException {
    Thread thread = new Thread();
    int hours = (int) jSpinner1.getValue();
    int minutes = (int) jSpinner2.getValue();
    int seconds = (int) jSpinner3.getValue();

    for (int a = seconds; a <= 0; a--) {

            Thread.sleep(1000);
            System.out.println(a);
        }
    }

}

enter image description here

2 个答案:

答案 0 :(得分:1)

实施明智有很多错误。

无需在函数

上抛出异常
throws InterruptedException 

要创建新的Thread,您必须提供要在所述主题中运行的代码(AKA Runnable):

Thread thread = new Thread(new Runnable () {
        @Override
        public void run(){
            // Your code here
        }
    });
thread.start();

除此之外,我无法理解以下代码的目标:

for (int a = seconds; a <= 0; a--) {
    Thread.sleep(1000);
    System.out.println(a);
}

你想通过倒计时秒来实现什么目标?小时和分钟怎么样?

我将提供一个解决方案,您必须完成该代码才能按照您想要的方式工作,因为它将倒数整个秒数。如果您想更新小时和分钟值,您必须自己处理。

private void countDownTimer() {

    final int hours = (int) jSpinner1.getValue();
    final int minutes = (int) jSpinner2.getValue();
    final int seconds = (int) jSpinner3.getValue();

    // Create Thread not to block UI
    Thread thread = new Thread(new Runnable () {

        @Override
        public void run() {
            // Calculate total seconds to count down
            int countdownSeconds = hours * 3600 + minutes * 60 + seconds;

            // Count down to 0 and print it on the console
            for (int i = countdownSeconds ; i >= 0; i--) {

                try{
                    Thread.sleep(1000);
                }catch (InterruptedException e) {}

                System.out.println(i);
            }
        }
    });
    // Start the Thread
    thread.start();
}

希望你觉得它很有用。随意对评论提出问题。

答案 1 :(得分:0)

我无法对你的问题发表评论,因为我没有50分,所以我必须在这里写一个问题的答案。

您说上面的代码无效。究竟什么不起作用?有什么症状,你期望发生什么?

其中一个问题是你只是在几秒钟内迭代,完全忽略了几分钟和几小时。另一个是您正在创建一个根本不使用的线程。第三个是你在for循环中调用Thread.sleep(1000),但我不确定你是否知道它会完全阻止线程直到它完成。

首先,for循环应该以:

开头
for (int a = hours * 3600 + 60 * minutes + seconds; a >= 0; a--)

其次,Thread thread = new Thread();根本没用过。

第三,Thread.sleep(1000)将阻止当前线程,直到它完成。

最后,您的情况是a <= 0而不是a >= 0

因此,您可以调整上述代码的方法之一是:

private void countDownTimer() throws InterruptedException {
    int hours = (int) jSpinner1.getValue();
    int minutes = (int) jSpinner2.getValue();
    int seconds = (int) jSpinner3.getValue();

    for (int a = hours * 3600 + 60 * minutes + seconds; a >= 0; a--) {
            Thread.sleep(1000);
            System.out.println(a);
        }
    }
}

这是假设'不工作'&#39;意味着它忽略了分钟和小时。

另一个解决方案是创建一个带回调函数的新线程,一旦倒计时器到达零,就会调用它:

public class CountDownRunnable implements Runnable {
    private final int hours;
    private final int minutes;
    private final int seconds;

    public CountDownRunnable(int hours, int minutes, int seconds) {
      this.hours = hours;
      this.minutes = minutes;
      this.seconds = seconds;
    }

    public void run() {
        for (int a = hours * 3600 + 60 * minutes + seconds; a >= 0; a--) {
            Thread.sleep(1000);
            System.out.println(a);
        }

        // Here goes your code that will be invoked once the timer reaches zero...
    }
}

然后你的方法看起来像这样:

private void countDownTimer() throws InterruptedException {
    (new Thread(new HelloRunnable())).start();
}