Этот код:
animation = new Timeline(new KeyFrame(Duration.seconds(1), e -> CountDown()));
animation.setCycleCount(Timeline.INDEFINITE);
animation.play();
Вызывает этот метод 1 :
private void CountDown() {
for (this.minutes = 25; minutes >= 0; minutes--) {
for (this.seconds = 59; seconds >= 0; seconds--) {
this.defaultTime.setMinutes(minutes);
this.defaultTime.setSeconds(seconds);
timer.setText(defaultTime.toString());
}
}
}
Один раз в секунду.
Однако циклы for
сбрасывают время на 25
минуты и ведут обратный отсчет до 0
для каждого вызова CountDown()
. Там нет задержки в этом обратном отсчете. Каждую секунду таймер переключается с 25
на 0
так же быстро, как ваш компьютер выполняет код. Из-за скорости, с которой это происходит, а также использования JavaFX с отложенным рендерингом, вы только когда-либо увидите, как текст Label
перейдет с 25:00
на 0:00
.
То, что вы хотите сделать, это уменьшать секунды на 1
каждый раз, когда вызывается CountDown()
. Если секунды равны 0
, уменьшите минуты на 1
и установите для секунд значение 59
. Примерно так:
private void countDown() {
if (seconds == 0) {
minutes--;
seconds = 59;
} else {
seconds--;
}
defaultTime.setMinutes(minutes);
defaultTime.setSeconds(seconds);
timer.setText(defaultTime.toString());
}
Не забудьте остановить анимацию после завершения обратного отсчета.
1. В соответствии с надлежащими соглашениями об именах Java метод должен называться countDown()
.