![](/img/trans.png)
[英]How do you make a label change the displayed text on a specific action in Java?
[英]How do you change label text in java after a timer ticks a second passed?
我有一個延遲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");
}
}
我假設對您的問題的回答是“為什么這不起作用?”,是您絕對不會重新檢查經過的時間。 可變延遲始終設置為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與線程(而不是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);
編輯:正如Stefan指出的那樣,對於Swing GUI應用程序,Swing Timer是最佳選擇。
它看起來應該像這樣:
1)創建計時器
2)創建TimerTask並實現run方法(更新您的count變量並檢查counter是否為零。如果為零,則停止計時器)
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,您的回答顯示了我以前從未嘗試過的選項。 正如他最后在編輯中建議的那樣,如果您正在使用GUI,那么javax.swing.Timer會非常方便。
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();
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.