簡體   English   中英

循環中的Java Update JLabel

[英]Java Update JLabel in a loop

很抱歉張貼關於Java擺動和循環的另一個主題。 我已經讀過其他人的書,但沒有一種解決方案真正適合我。 好的,現在就解決問題了。 我有一個擴展JFrame的類,其中有一個運行秒表的Timer,如下所示:

class StopWatch extends TimerTask{
    public void run() {
        time.setText(String.format("%02d:%02d", minutes_elapsed,seconds_elapsed));
        seconds_elapsed++;
        if(seconds_elapsed == 60){
            seconds_elapsed = 0;
            minutes_elapsed++;
        }
    }

}

現在,我的標簽“時間”更新的唯一方法是當我調用time.update(time.getGraphics())時,但這是在上一個時間繪制的。 有什么想法我應該做什么? 我也嘗試過重塗,驗證和繪制。 Paint對我而言具有與更新相同的功能...任何想法嗎? PS我不知道這是否重要,但是我在公共void start_timer()函數中創建了Timer,如下所示:

public void start_timer(int minutes, int seconds){
        if(timer == null)
             timer = new Timer();
        timer.scheduleAtFixedRate(new StopWatch(),0,1000);
    }

我懷疑您正在使用java.util.Timer而不是javax.swing.Timer 后者將確保計時器在UI線程上運行,我懷疑這是問題所在。

有關它們的教程,請參見“如何使用Swing計時器” 您需要將TimerTask轉換為ActionListener`,然后使用

timer.setDelay(1000);
timer.setRepeats(true);
timer.start();

你可以這樣做

public void run() 
{
    SwingUtilities.invokeLater(new Runnable()
    {
        @Override
        public void run()
        {
            // do stuff
        }
    }
    ));
}

但您確實應該使用javax.swing.Timer 請記住,Swing是單線程的,因此,必須在其線程中修改其組件(即Event Dispatch Thread )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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