【问题标题】:How to use Timeline to perform a void method every x seconds on JavaFX?如何使用时间轴在 JavaFX 上每 x 秒执行一次 void 方法?
【发布时间】:2019-11-09 11:52:08
【问题描述】:

问题:

我正在尝试使用 Timeline 每 0.5 秒调用一次 void 方法 action()。我研究了如何做到这一点,并查看了这个网站上的类似问题,但没有一个适合我。

我尝试过的#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(){}) is undefined”。

提前感谢您的帮助。

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    基于这一行:

    Duration sec = Duration.ofSeconds((long) 0.5);
    

    注意:0.5 转换为long 只会得到0

    您使用了错误的 Duration 类。以上表示您在需要使用javafx.util.Duration 时使用java.time.Duration。删除前者的 import 语句,并用后者替换它。然后把上面那行改成:

    Duration sec = Duration.seconds(0.5);
    

    请注意,JavaFX Duration 类的静态方法名为 seconds,而不是 ofSeconds。此外,如果您希望Timeline0.5 秒重复调用您的方法,那么您需要将其cycle count 设置为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 方法以更好地满足您的问题.

    【讨论】:

      猜你喜欢
      • 2018-06-06
      • 2012-07-11
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多