Как использовать Timeline для выполнения пустого метода каждые x секунд на JavaFX? - PullRequest
0 голосов
/ 09 ноября 2019

Проблема:

Я пытаюсь использовать Временную шкалу, чтобы вызвать метод действия void () каждые 0,5 секунды. Я исследовал, как это сделать, и посмотрел на похожие вопросы на этом сайте, но ни один из них не работает для меня.

Что я пробовал # 1:

Duration sec = Duration.ofSeconds((long) 0.5);
this.timeline = new Timeline(new KeyFrame(sec, e -> {
    action();
}));

Ошибка вышевызвано: «Конструктор KeyFrame (Duration, (e) -> {}) не определен».

Что я пробовал # 2:

this.timeline = new Timeline(new KeyFrame(Duration.ofSeconds((long) 0.5), new EventHandler<ActionEvent>() 
        {

            @Override
            public void handle(ActionEvent event) {
                action();
            }
            }));

Ошибка, вызванная выше: "Конструктор KeyFrame (Duration, new EventHandler () {}) не определен ".

Заранее благодарим за любую помощь.

1 Ответ

1 голос
/ 09 ноября 2019

Исходя из этой строки:

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 метод, чтобы лучше соответствовать вашему вопросу.

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