如何在JavaFX中使用PauseTransition方法?

Rin*_*Rin 4 javafx

我读过这本书,但我仍然对暂停过渡方法感到困惑.我制作了一个显示数字的标签,我希望每秒都能增加这个数字.

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应用程序线程上进行更新,而基于时间轴的解决方案不需要任何更新.