1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| public class DemoTimer {
private static final long DELAY = 500;
private final JButton startButton;
private final JButton stopButton;
private final JButton pauseOrResumeButton;
private final JLabel label;
private final Timer timer;
private Task timerTask;
private javax.swing.Timer blinkTask;
public DemoTimer() {
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
timer = new Timer();
label = new JLabel("0:00:00", JLabel.CENTER);
frame.add(label);
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
startButton = new JButton("Start");
startButton.addActionListener(e -> start());
pauseOrResumeButton = new JButton("Pause");
pauseOrResumeButton.addActionListener(e -> pauseOrResume());
pauseOrResumeButton.setEnabled(false);
stopButton = new JButton("Stop");
stopButton.addActionListener(e -> stop());
stopButton.setEnabled(false);
buttonPanel.add(startButton);
buttonPanel.add(pauseOrResumeButton);
buttonPanel.add(stopButton);
frame.add(buttonPanel, BorderLayout.SOUTH);
frame.setSize(400,300);;
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private void start() {
blinkStop();
timerTask = new Task();
timer.schedule(timerTask, 0, DELAY);
startButton.setEnabled(false);
pauseOrResumeButton.setEnabled(true);
stopButton.setEnabled(true);
startButton.setText("Start");
pauseOrResumeButton.setText("Pause");
}
private void pauseOrResume() {
if ( timerTask.isRunning() ) {
pause();
}
else {
resume();
}
}
private void pause() {
timerTask.cancel();
stopButton.setEnabled(true);
startButton.setEnabled(true);
pauseOrResumeButton.setText("Resume");
startButton.setText("Restart");
blinkStart();
}
private void resume() {
blinkStop();
timerTask=new Task(timerTask);
timer.schedule(timerTask, 0, DELAY);
startButton.setEnabled(false);
stopButton.setEnabled(true);
startButton.setText("Start");
pauseOrResumeButton.setText("Pause");
startButton.setText("Start");
}
private void stop() {
timerTask.cancel();
blinkStop();
stopButton.setEnabled(false);
pauseOrResumeButton.setEnabled(false);
startButton.setEnabled(true);
startButton.setText("Start");
pauseOrResumeButton.setText("Pause");
timer.purge();
}
private void blinkStart() {
if ( blinkTask!=null ) {
blinkTask.stop();
}
blinkTask = new javax.swing.Timer((int)DELAY, e-> label.setVisible(!label.isVisible()));
blinkTask.start();
}
private void blinkStop() {
if ( blinkTask!=null ) {
blinkTask.stop();
blinkTask=null;
label.setVisible(true);
}
}
public static void main(String[] args) {
new DemoTimer();
}
private class Task extends TimerTask {
final long start;
private boolean running;
public Task() {
this(System.currentTimeMillis());
}
public Task(Task task) {
this(task.start);
}
public Task(long start) {
this.start=start;
}
@Override
public boolean cancel() {
final boolean cancel = super.cancel();
running=false;
return cancel;
}
public boolean isRunning() {
return running;
}
@Override
public void run() {
running=true;
final long time = System.currentTimeMillis() - start;
final int seconds = (int) (time / 1000);
final String message = String.format("%d:%02d:%02d", seconds / 3600, (seconds % 3600) / 60, (seconds % 60));
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setText(message);
}
});
}
};
} |
Partager