我读过这本书,但我仍然对暂停过渡方法感到困惑.我制作了一个显示数字的标签,我希望每秒都能增加这个数字.
jew*_*sea 10
如何使用PauseTransition
甲PauseTransition为一次性的停顿.以下示例将在暂停一秒后更新标签文本:
label.setText("Started");
PauseTransition pause = new PauseTransition(Duration.seconds(1));
pause.setOnFinished(event ->
label.setText("Finished: 1 second elapsed");
);
pause.play();
Run Code Online (Sandbox Code Playgroud)
为什么PauseTransition不适合你
但这不是你想要做的.根据您的问题,您希望每秒更新标签,而不仅仅是一次.您可以将暂停转换设置为无限循环,但这对您没有帮助,因为您无法在JavaFX 8中的循环完成时设置事件处理程序.如果PauseTransition无限循环,则永远不会调用转换的完成处理程序因为过渡永远不会完成.所以你需要另一种方法来做到这一点......
您应该使用时间轴
根据Tomas Mikula的建议,使用时间轴而不是PauseTransition.
label.setText("Started");
final IntegerProperty i = new SimpleIntegerProperty(0);
Timeline timeline = new Timeline(
new KeyFrame(
Duration.seconds(1),
event -> {
i.set(i.get() + 1);
label.setText("Elapsed time: " + i.get() + " seconds");
}
)
);
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
Run Code Online (Sandbox Code Playgroud)
使用Timer的备用解决方案
对于以下问题,有一种基于Timer的备用解决方案:
但是,我更喜欢基于时间轴的解决方案来解决这个问题的Timer解决方案.Timer需要一个新线程,并且要特别小心,以确保在JavaFX应用程序线程上进行更新,而基于时间轴的解决方案不需要任何更新.