我正在开发这个小应用程序。在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);
}
}
}
答案 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();
}