Таймер обратного отсчета в JavaFX

Нужно сделать таймер обратного отсчета на 1 минуту в JavaFX. Гуглил просто countdown timer in java, пробовал, но выдает ошибку, что не в FX потоке. На stackoverflow был один ответ, но не получилось с ним. Как быть? Thread.sleep(1000) вообще не вариант.


Ответы (1 шт):

Автор решения: siarhei987

Вариант на основе этого ответа с использованием Timeline.

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Duration;

public class SimpleTimerApp extends Application {

    @Override
    public void start(Stage stage) {

        var root = new StackPane();
        var countDownSeconds = 60;
        var seconds = new SimpleIntegerProperty(countDownSeconds);

        var remainingTime = new Label();
        remainingTime.setFont(Font.font(40));
        remainingTime.textProperty().bind(seconds.asString());

        var timeLine = new Timeline(
                new KeyFrame(Duration.seconds(1), action ->
                        seconds.set(seconds.intValue() - 1))
        );
        timeLine.setCycleCount(countDownSeconds);

        var startBtn = new Button("Пуск (" + countDownSeconds + " с.)");
        startBtn.setOnAction(action -> {
            timeLine.play();
            root.getChildren().setAll(remainingTime);
        });

        root.getChildren().add(startBtn);
        stage.setScene(new Scene(root, 250, 200));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
→ Ссылка