循环中的Java Update JLabel

时间:2012-08-06 16:50:01

标签: java swing loops timer

很抱歉发布了另一个关于Java swing和循环的帖子。我已经读完了其他人,但没有一个解决方案真的适合我。好的,现在就解决问题吧。我有一个扩展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())时,这会涂抹上一次。任何想法我应该做什么?我也尝试过重绘,验证和绘画。对我来说,油漆做同样的事情,更新确实...任何想法? P.S我不知道它是否重要但我在public void start_timer()函数中创建了Timer,如下所示:

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

2 个答案:

答案 0 :(得分:5)

我怀疑您使用的是java.util.Timer而不是javax.swing.Timer。后者将确保计时器在UI线程上运行,我怀疑是问题所在。

有关它们的教程,请参阅"How to use Swing Timers"。您需要将TimerTask转换为ActionListener,然后使用

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

答案 1 :(得分:4)

你可以这样做

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

但你确实应该使用javax.swing.Timer。请记住,Swing是单线程的,因此,必须在其线程中修改其组件(即 Event Dispatch Thread )。