Таймер обратного отсчета в 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);
}
}