簡體   English   中英

在計時器滴答作響之后,如何更改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM