使用线程创建数字时钟

时间:2012-01-20 09:57:39

标签: java

我正在尝试使用Thread创建一个数字时钟,因为在我看来这是一个合理的方式。 我不确定我是否采用正确的方式,但我想到的是使用JFrame构造函数创建初始当前系统时间并使用标签将其显示为文本。然后在构造函数中创建用于更新时间的线程对象。

苦苦挣扎,希望就如何正确行事提出一些建议。

setDefaultCloseOperation((JFrame.EXIT_ON_CLOSE));
        setBounds(50, 50, 200, 200);

        JPanel pane = new JPanel();
        label = new JLabel();

        //Font localTime = new Font("Lumina", Font.BOLD , 24);

        pane.add(label);
        add(pane);
        sdf = new SimpleDateFormat("HH:mm:ss");
        date = new Date();

        s = sdf.format(date);
        label.setText(s);
        setVisible(true);
        runner = new Thread(this);

        while(runner == null)
        {
            runner = new Thread(this);
            runner.start();

        }

然后我的run()方法每秒更新一次。

public void run()
{
    while(true)
    {
        try
        {
            Thread.sleep(1000);
            sdf = new SimpleDateFormat("HH:mm:ss");
            date = new Date();
            s = sdf.format(date);
            label.setText(s);
        }
        catch(Exception e){}

    }

主要方法。

public static void main(String[] args)
{
    new DigitalClock().setVisible(true);


}

3 个答案:

答案 0 :(得分:2)

你想改进什么?它看起来没问题,while(runner == null)没有必要,你正在初始化跑步者。

答案 1 :(得分:2)

应在事件调度线程中更新标签状态。

您需要添加以下修改:

    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            label.setText(s);
        }
    });

而不是简单地从单独的线程更新标签。

值得看一下The Swing GUI Freezing Problem的简单描述,这是一个简单的解决方案。

答案 2 :(得分:1)

查看此课程http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Timer.html scheduleAtFixedRate(TimerTask任务,长延迟,长周期)可能就是你所需要的。