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?
1 Answer
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.
5 Comments
Dangerosking
I made the GUI using the visual editor from netbeans, how can I reference a jlabel inside the GUI?
GETah
@trashgod which part needs an invokeLater?
millimoose
@GETah The
run() method of UpdateUITask, since a java.util.Timer will run it off the EDT.millimoose
(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.)GETah
@trashgod Thanks for the updates ;) +1 for you answer on the other related question ;)
Swing'sTimerclass. More on the way of using theTimeris available, for example, in the question and particularly answers to it.Timer. @trashgod very nice answer/sample +1 here and +1 there... and I am out of votes ... for today :)