如何在JavaFX中使用PauseTransition方法?

如何在JavaFX中使用PauseTransition方法?,javafx,Javafx,我读了这本书,但我仍然对暂停转换方法感到困惑。 我制作了一个显示数字的标签,我希望该数字每秒钟增加一次。如何使用暂停转换 A表示一次性暂停。以下示例将在暂停一秒钟后更新标签文本: label.setText("Started"); PauseTransition pause = new PauseTransition(Duration.seconds(1)); pause.setOnFinished(event -> label.setText("Finished: 1 second

我读了这本书,但我仍然对暂停转换方法感到困惑。 我制作了一个显示数字的标签,我希望该数字每秒钟增加一次。

如何使用暂停转换

A表示一次性暂停。以下示例将在暂停一秒钟后更新标签文本:

label.setText("Started");
PauseTransition pause = new PauseTransition(Duration.seconds(1));
pause.setOnFinished(event ->
   label.setText("Finished: 1 second elapsed");
);
pause.play();
为什么暂停转换不适合你

但这不是你想做的。根据您的问题,您希望每秒钟更新一次标签,而不是仅更新一次。您可以将暂停转换设置为无限期循环,但这对您没有帮助,因为您无法在JavaFX8中设置循环完成时的事件处理程序。如果PauseTransfion无限期循环,则将永远不会调用转换的完成处理程序,因为转换将永远不会完成。所以你需要另一种方法来做到这一点

你应该使用时间线

如所示,使用暂停转换而不是暂停转换

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();
带定时器的替代解决方案

对于以下问题,有一种基于a的替代解决方案:

然而,我更喜欢基于时间线的解决方案,而不是那个问题的计时器解决方案。计时器需要一个新线程,并特别注意确保在JavaFX应用程序线程上进行更新,而基于时间线的解决方案不需要任何更新。

如以下评论所述:

如果在中再次启动Pause Transition,则可以使用它 整理工


完整地说,如果您在finish处理程序中再次启动PauseTransition,那么可以使用PauseTransition,如果我是正确的。
int cycle = 0;
label.setText("Started");
PauseTransition pause = new PauseTransition(Duration.seconds(1));
pause.setOnFinished(event ->
   label.setText("Finished cycle " + cycle++);
   pause.play(); 
);
pause.play();