问题:
我尝试使用时间轴每 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(){}) 未定义”。
预先感谢您的帮助。
最佳答案
基于这一行:
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
秒重复调用您的方法,那么您需要将其设置为 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
方法来更好地满足您的问题。
关于java - 如何使用 Timeline 在 JavaFX 上每 x 秒执行一个 void 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58775873/