我有一个延迟 5 秒的计时器。我试图在经过一秒钟后更改名为 lblTimer 的标签以用作倒计时。我遇到了问题,因为目前它只能在 5 秒内工作。你有什么建议建议吗?
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");
}
}
Run Code Online (Sandbox Code Playgroud)
你的问题的答案,我假设是“为什么这不起作用?”,是不是你在任何时候都不会重新检查经过的时间。可变延迟始终设置为 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");
Run Code Online (Sandbox Code Playgroud)
不要真的这样做,除非你需要满足你生病的恋物癖。
四线
和上面一样。不要这样做。
for (int i = secondsToWait; i >= 0; i--) {
lblTimer.setText(i + "");
Thread.sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)
可接受的解决方案:
使用计时器来安排在给定时间段后执行的任务。您还可以使用计时器在给定的时间间隔内多次触发同一任务。
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);
Run Code Online (Sandbox Code Playgroud)
最佳解决方案:
使用ScheduledExecutorService代替计时器。这更好,因为 ScheduledExecutorService 使用线程而不是 Timer 的方式。去谷歌上查询。
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);
Run Code Online (Sandbox Code Playgroud)
编辑:正如 Stefan 指出的那样,对于 Swing GUI 应用程序,Swing Timer将是最佳选择。