我有5秒的延迟的计时器。 我想之后的第二次通过充当倒计时更改名为lblTimer标签。 我有问题,用它作为目前它只能在5秒。 你有什么suggestionsuggestions?
protected void Addition() {
//addition function
final int delay = 5000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
@SuppressWarnings("unused")
public void actionPerformed(ActionEvent evt) {
//...Perform a task...
frame.getContentPane().setBackground(Color.red);
}
};
new Timer(delay, taskPerformer).start();
Random RandomNumber = new Random();
int number1 = RandomNumber.nextInt(12);
int number2 = RandomNumber.nextInt(12);
int number3 = RandomNumber.nextInt(12);
lblAnswer.setText("");
lblFirstNumber.setText(""+ number1);
lblfunction1.setText("+");
lblsecondNumber.setText(""+number2);
lblfunction2.setText("+");
lblthirdnumber.setText(""+number3);
lblequals.setText("=");
answer = number1+number2+number3;
if(delay <= 1000){
lblTimer.setText("1");
}
else if(delay == 2000){
lblTimer.setText("2");
}
else if(delay == 3000){
lblTimer.setText("3");
}
else if(delay == 4000){
lblTimer.setText("4");
}
else if (delay == 5000){
lblTimer.setText("5");
}
}
在回答你的问题,我认为是“为什么会发生这种不工作?”,就是在任何时候你重新检查所经过的时间。 可变延迟总是被设置在5000,从不更新,也。
愚蠢的屁股的解决方案:
lblTimer.setText("5");
Thread.sleep(1000)
lblTimer.setText("4");
Thread.sleep(1000)
lblTimer.setText("3");
Thread.sleep(1000)
lblTimer.setText("2");
Thread.sleep(1000)
lblTimer.setText("1");
Thread.sleep(1000)
lblTimer.setText("0");
不要真正做到这一点,除非你需要满足你生病的恋物癖。
四衬垫
与上述相同。 不要这样做。
for (int i = secondsToWait; i >= 0; i--) {
lblTimer.setText(i + "");
Thread.sleep(1000);
}
可接受的解决方案:
使用计时器安排任务给定的时间段后执行。 您可以使用定时器多次也火了相同的任务在给定的时间间隔。
Timer timer = new Timer();
int secondsToWait = 5;
TimerTask task = new TimerTask() {
@Override
public void run() {
secondsToWait--;
lblTimer.setText(secondsToWait + "");
if (secondsToWait == 0) {
timer.cancel();
timer.purge();
}
}
};
lblTimer.setText(secondsToWait + "");
timer.scheduleAtFixedRate(task, 1000, 1000);
最好的解决办法:
取而代之的是定时器,使用ScheduledExecutorService的 。 这是因为ScheduledExecutorService的工作与线程,而不是定时的方式更好。 谷歌一下。
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
int secondsToWait = 5;
Runnable task = new Runnable() {
@Override
public void run() {
secondsToWait--;
lblTimer.setText(secondsToWait + "");
if (secondsToWait == 0) {
exec.shutdown();
}
}
};
lblTimer.setText(secondsToWait + "");
exec.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS);
编辑:正如斯蒂芬指出,对Swing GUI的应用挥杆定时器将是最好的选择。
它应该是这个样子:
1)创建定时器
2)创建的TimerTask并实现run方法(更新计数变量,并检查计数器是零。如果是零,停止计时器)
3)安排运行每第二任务
int count = [INITVALUE];
...
public void startMethod() {
final Timer timer = new Timer();
timer.shedule(new TimerTask() {
@Override
public void run() {
count--;
lblTimer.setText(count+"");
if (count == 0) {
timer.cancel();
timer.purge();
}
}
},1000);
}
大拇指@Olavi Mustanoja你的答案透露我现在之前从未尝试过的选项。 当他在他的最后编辑建议javax.swing.Timer中是非常方便的,如果你使用GUI的工作。
import javax.swing.Timer;
private int secondsToWait = 5000; //Time in milliseconds
private Timer timer;
....
//The following section should be inside a method member
timer = new Timer(secondsToWait, e -> {
if(secondsToWait == 0)
timer.stop();//Stop if secondsToWait is already zero
lblTimer.setText((secondsToWait/1000) + ""); //Update the label with the current sec
timer.setDelay(secondsToWait);
secondsToWait -= 1000; //Reduce time by 1sec each time
});
timer.start();
...