5

I'm a Java beginner and I'm trying to build a simple stopwatch program that displays the time on a swing GUI. Making the stopwatch is easy, however I cannot find a way to make the GUI update every second and display the current time on the stopwatch. How can I do this?

5
  • 10
    Use Swing's Timer class. More on the way of using the Timer is available, for example, in the question and particularly answers to it. Commented Jun 15, 2012 at 21:06
  • 3
    See also this answer. Commented Jun 15, 2012 at 21:13
  • Yea I know I had it somewhere one of my answers related to use of Timer. @trashgod very nice answer/sample +1 here and +1 there... and I am out of votes ... for today :) Commented Jun 15, 2012 at 21:32
  • @trashgod Just had a look to your answer, it looks far more better then mine. I will just delete my answer below :) Commented Jun 15, 2012 at 21:51
  • 1
    Please have a glance at this example code too :-) Commented Jun 16, 2012 at 1:20

1 Answer 1

6

Something along these lines should do it:

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

/** @see https://stackoverflow.com/a/11058263/230513 */
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();
            }
        });
    }
}

The timeLabel will always display the number of seconds the timer has been running.

  1. You will need to correctly format it to display "hh:mm:ss"; one approach is shown here.

  2. Create a container and add the label to it so that you can display it as part of the GUI.

  3. Compare the result to this alternate using javax.swing.Timer.

Sign up to request clarification or add additional context in comments.

5 Comments

I made the GUI using the visual editor from netbeans, how can I reference a jlabel inside the GUI?
@trashgod which part needs an invokeLater?
@GETah The run() method of UpdateUITask, since a java.util.Timer will run it off the EDT.
(Also, a ScheduleExecutorService would probably the more modern equivalent to a java.util.Timer to begin with, if only to use the same API anywhere you need to have background tasks running.)
@trashgod Thanks for the updates ;) +1 for you answer on the other related question ;)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.