Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating digital clock using a thread

Tags:

java

I am trying to create a digital clock using a Thread as this seems to me the logical way one would do it. I am not sure if I am going about it the right way but what I had in mind is to create the initial current System time using the JFrame constructor and display it as text using a label. In the constructor I then create the thread object with which to update the time.

Struggling a bit and was hoping for some advice as to how to do it right.

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();

        }

This is then my run() method to update the clock every second.

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){}

    }

Main method.

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


}
like image 235
Arianule Avatar asked Jan 20 '12 09:01

Arianule


2 Answers

The label state should be updated in the Event Dispatch Thread.

You need to add the following modification:

    SwingUtilities.invokeLater(new Runnable() {

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

instead of simply updating the label from the separate thread.

It's worth to have a look at the simple description of The Swing GUI Freezing Problem and it's simple solution.

like image 161
MockerTim Avatar answered Sep 29 '22 13:09

MockerTim


What do you want to improve? It looks ok, while(runner == null) not necessary, you're initialising runner just above.

like image 37
isah Avatar answered Sep 29 '22 13:09

isah