Исходя из этой строки:
Duration sec = Duration.ofSeconds((long) 0.5);
Примечание: Приведение 0.5
к long
просто даст вам 0
.
Вы используете неправильный Duration
класс. Выше указано, что вы используете java.time.Duration
, когда вам нужно использовать javafx.util.Duration
. Удалите оператор импорта для первого и замените его другим. Затем измените приведенную выше строку на:
Duration sec = Duration.seconds(0.5);
Обратите внимание, что статический метод для класса JavaFX Duration
называется seconds
, а не ofSeconds
. Кроме того, если вы хотите, чтобы Timeline
неоднократно вызывал ваш метод каждые 0.5
секунд, вам нужно установить счетчик циклов на Animation#INDEFINITE
.
Вот пример:
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;
public class App extends Application {
private Label label;
private int count;
@Override
public void start(Stage primaryStage) {
label = new Label();
Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(0.5), e -> incrementLabel()));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.playFromStart();
primaryStage.setScene(new Scene(new StackPane(label), 500, 300));
primaryStage.show();
}
private void incrementLabel() {
label.setText(String.format("%,d", count++));
}
}
Примечание: «Увеличение» текста Label
можно выполнить непосредственно в EventHandler
, но я переместил его вvoid
метод, чтобы лучше соответствовать вашему вопросу.