Проблема с реализацией таймера обратного отсчета в JavaFx - PullRequest
0 голосов
/ 05 января 2019

Я играл с анимационной платформой JavaFx, чтобы создать таймер, который будет отсчитывать от 25 минут.

Сейчас мой код выполняет обратный отсчет от 25 минут, но не обновляет и не анимирует метку каждую секунду. Это то, что я пробовал до сих пор:

Это обработчик событий, который начинает обратный отсчет при нажатии кнопки

public class CountdownActionEvent implements EventHandler<ActionEvent> {

private Timer defaultTime;
private Label timer;
private Timeline animation;
private int minutes;
private int seconds;

public CountdownActionEvent(Timer timer, Label label) {
    this.defaultTime = timer;
    this.timer = label;
}

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());
        }
    }

}

@Override
public void handle(ActionEvent event) {
    // TODO Auto-generated method stub

    animation = new Timeline(new KeyFrame(Duration.seconds(1), e -> CountDown()));
    animation.setCycleCount(Timeline.INDEFINITE);
    animation.play();

}
}

Также это класс Timer, назначенный объекту defaultTime:

public class Timer {

private String minutes;
private String seconds;

public Timer() {
    this.minutes = "25";
    this.seconds = "00";
}

public String getMinutes() {
    return this.minutes;
}

public String getSeconds() {
    return this.seconds;
}

public void setMinutes(int min) {
    if (min < 10) {
        this.minutes = "0" + min;
    } else {
        this.minutes = min + "";
    }
}

public void setSeconds(int sec) {
    if (sec < 10) {
        this.seconds = "0" + sec;
    } else {
        this.seconds = sec + "";
    }
}

public String toString() {
    return this.minutes + ":" + this.seconds;
}

}

когда я запускаю эту программу, ярлык «таймер» мгновенно обновляется до 0 при нажатии кнопки. Я пытался найти возможное решение, но не могу решить эту проблему. Любая помощь приветствуется. Спасибо!

1 Ответ

0 голосов
/ 05 января 2019

Этот код:

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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...