繁体   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