Итак, вы фиксируете start
private long start = Calendar.getInstance().getTimeInMillis();
, когда класс создается впервые ... не уверен, что это хорошая идея, но давайте продолжим ...
Когда вы останавливаете таймер ...
pause.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
elapsed += now;
swTimer.stop();
}
});
вы захватываете elapsed
время
Когда вы возобновляете часы ...
public void continueTime(){
long temp = Calendar.getInstance().getTimeInMillis();
time.setText("Elapsed time is " + formatTime((long) (temp - start)));
}
private void timerContinue(){
ActionListener timerAL = new ActionListener(){
public void actionPerformed(ActionEvent e){
continueTime();
}
};
//stop the timer if it is still running
if (swTimer != null && swTimer.isRunning()) {
swTimer.stop();
}
swTimer = new Timer(1000, timerAL);
swTimer.setInitialDelay(0);
swTimer.start();
}
Выиспользуя текущее время и вычитая start
, но start
никогда не сбрасывался, поэтому он по-прежнему рассчитывается с момента, когда он был инициализирован.
Концептуально, часы с "паузой" - это часы, которые имеютдва важных состояния.
- «Текущее» время выполнения.Это время с момента его запуска / возобновления до настоящего времени
- «Предыдущее» время выполнения.Это общее количество времени, в течение которого таймеру разрешено работать.
Итак.Когда вы останавливаете часы, вам нужно сделать пару вещей ...
- Рассчитать общее время работы для этой фазы - время с момента его запуска до настоящего времени.
- Добавьте это к общему «времени работы», которое отслеживает общее время, в течение которого часам было разрешено запускать.
- Сброс времени запуска (предпочтительно примерно на
null
, так что это очевидно)
При возобновлении необходимо ...
- Сохранить текущее время как
start
. - Рассчитать время между
start
время и сейчас (когда тикают часы) - Добавьте
totalRunningTime
к нему, что создает общее время работы часов.
Простой ?
Во-первых, сам вопрос не является чем-то необычным, и если вы потратите некоторое время на изучение проблемы, вам будет предложен ряд решений.
Сказав это, поскольку сейчас 2018 год, и на горизонте видна Java 11,вы действительно должны использовать более новый API даты / времени Java,который предоставляет ряд действительно полезных API, в том числе Duration
и возможность обрабатывать время независимо от базовой календарной системы ... поэтому мы не получаем странностей при переходе на летнее время ?
Ниже приведен примернекоторый библиотечный код, который я использую, который реализует описанную выше функциональность.
«Странно» то, что он независим от системы синхронизации.То есть он не «тикает».Вместо этого вы использовали бы Swing Timer
(в вашем случае) для вызова getDuration
и обновления пользовательского интерфейса по мере необходимости.
public class StopWatch {
private Instant startTime;
private Duration totalRunTime = Duration.ZERO;
public StopWatch start() {
startTime = Instant.now();
return this;
}
public StopWatch stop() {
Duration runTime = Duration.between(startTime, Instant.now());
totalRunTime = totalRunTime.plus(runTime);
startTime = null;
return this;
}
public StopWatch pause() {
return stop();
}
public StopWatch resume() {
return start();
}
public StopWatch reset() {
stop();
totalRunTime = Duration.ZERO;
return this;
}
public boolean isRunning() {
return startTime != null;
}
public Duration getDuration() {
Duration currentDuration = Duration.ZERO;
currentDuration = currentDuration.plus(totalRunTime);
if (isRunning()) {
Duration runTime = Duration.between(startTime, LocalDateTime.now());
currentDuration = currentDuration.plus(runTime);
}
return currentDuration;
}
}
И если вы хотите увидеть концепцию в действии, вы можетевзгляните на Добавление функции возобновления к секундомеру