【问题标题】:Java Update JLabel in a loopJava 循环更新 JLabel
【发布时间】:2012-08-03 16:12:27
【问题描述】:

很抱歉发布另一个关于 Java swing 和循环的帖子。我已经阅读了其他人,但没有一个解决方案真正适合我。好的,现在开始讨论这个问题。我有一个扩展 JFrame 的类,其中有一个运行秒表的计时器,如下所示:

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 对我做的事情和更新一样……有什么想法吗? P.S 我不知道这是否重要,但我在公共 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 swing loops timer


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢...是的,我刚刚意识到我一直在使用 java.util.Timer 而不是摇摆计时器。
    【解决方案2】:

    你可以这样做

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      相关资源
      最近更新 更多