Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用线程创建数字时钟_Java - Fatal编程技术网

Java 使用线程创建数字时钟

Java 使用线程创建数字时钟,java,Java,我试图创建一个数字时钟使用线程,因为在我看来,这似乎是一个合乎逻辑的方式会这样做。 我不确定我的方法是否正确,但我想到的是使用JFrame构造函数创建初始当前系统时间,并使用标签将其显示为文本。在构造器中,我然后创建线程对象来更新时间 有点挣扎,希望得到一些关于如何正确操作的建议 setDefaultCloseOperation((JFrame.EXIT_ON_CLOSE)); setBounds(50, 50, 200, 200); JPanel pane =

我试图创建一个数字时钟使用线程,因为在我看来,这似乎是一个合乎逻辑的方式会这样做。 我不确定我的方法是否正确,但我想到的是使用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);


}

你想改进什么?它看起来还可以,
而(runner==null)
不是必需的,您正在初始化上面的runner。

检查这个类
scheduleAtFixedRate(TimerTask任务、长延迟、长周期)可能是您需要的。标签状态应该在事件调度线程中更新

您需要添加以下修改:

    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            label.setText(s);
        }
    });
而不是简单地从单独的线程更新标签


值得一看的是对的简单描述,这是一个简单的解决方案。

您具体在努力解决什么问题?看起来运行程序永远不会为null,因为您在while(runner==null)检查之前实例化并为其分配了一个线程对象。哦和+1纯粹是因为很少看到在这里提问之前已经尝试过的家庭作业问题:)