每秒更新GUI的Java秒表?

5

我是一名Java初学者,正在尝试构建一个简单的秒表程序,该程序在swing GUI上显示时间。制作秒表很容易,但是我无法找到一种方法使GUI每秒更新一次,并在秒表上显示当前时间。我该如何实现呢?


10
请使用 SwingTimer 类。有关如何使用 Timer 的更多信息,请参见这个问题以及其中的答案。 - Boro
3
请参考这个答案:http://stackoverflow.com/a/5529043/230513。 - trashgod
是的,我知道我在某个地方有它我的一个与Timer使用相关的答案。@trashgod非常好的答案/示例,在这里+1,在那里+1...而且我今天的投票用完了 :) - Boro
@trashgod,我刚看了你的回答,看起来比我的好得多。我会删除下面的回答 :) - GETah
1
请看一下这个示例的代码 :-) - nIcE cOw
1个回答

6

以下内容可以满足需求:

import java.awt.EventQueue;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JLabel;

/** @see https://dev59.com/fGXWa4cB1Zd3GeqPIwnd#11058263 */
public class Clock {

    private Timer timer = new Timer();
    private JLabel timeLabel = new JLabel(" ", JLabel.CENTER);

    public Clock() {
        JFrame f = new JFrame("Seconds");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(timeLabel);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        timer.schedule(new UpdateUITask(), 0, 1000);
    }

    private class UpdateUITask extends TimerTask {

        int nSeconds = 0;

        @Override
        public void run() {
            EventQueue.invokeLater(new Runnable() {

                @Override
                public void run() {
                    timeLabel.setText(String.valueOf(nSeconds++));
                }
            });
        }
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                final Clock clock = new Clock();
            }
        });
    }
}
timeLabel将始终显示计时器运行的秒数。
  1. 您需要正确格式化它以显示“hh:mm:ss”; 可以参考这里的方法。

  2. 创建一个容器并将标签添加到其中,以便您可以将其作为GUI的一部分显示。

  3. 使用javax.swing.Timer将结果与此处进行比较。


我使用NetBeans的可视化编辑器制作了GUI,如何在GUI中引用JLabel? - Dangerosking
@trashgod 哪部分需要使用 invokeLater? - GETah
@GETah UpdateUITask зҡ„ run() ж–№жі•пјҢеӣ дёә java.util.Timer дјҡеңЁ EDT д№ӢеӨ–иҝҗиЎҢе®ғгҖӮ - millimoose
(此外,如果您需要在后台运行任务,ScheduleExecutorService 可能是更现代的等效替代 java.util.Timer,尤其是在需要在多个地方使用相同的 API 时。) - millimoose
@trashgod 感谢您的更新 ;) 在其他相关问题上,我给您的回答点赞 +1 ;) - GETah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接