【发布时间】:2015-05-30 07:38:24
【问题描述】:
我读过这本书,但我仍然对暂停转换方法感到困惑。 我做了一个显示数字的标签,我希望这个数字每秒增加一次。
【问题讨论】:
标签: javafx
我读过这本书,但我仍然对暂停转换方法感到困惑。 我做了一个显示数字的标签,我希望这个数字每秒增加一次。
【问题讨论】:
标签: javafx
如何使用 PauseTransition
PauseTransition 用于暂停。以下示例将在暂停一秒后更新标签的文本:
label.setText("Started");
PauseTransition pause = new PauseTransition(Duration.seconds(1));
pause.setOnFinished(event ->
label.setText("Finished: 1 second elapsed");
);
pause.play();
为什么 PauseTransition 不适合你
但这不是你想做的。根据您的问题,您希望每秒更新一次标签,而不仅仅是一次。您可以将暂停转换设置为无限循环,但这对您没有帮助,因为您无法在 JavaFX 8 中为循环完成设置事件处理程序。如果 PauseTransition 无限循环,则永远不会调用转换的完成处理程序因为过渡永远不会结束。所以你需要另一种方法来做到这一点......
你应该使用时间轴
作为suggested by Tomas Mikula,使用Timeline 而不是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();
使用计时器的替代解决方案
对于以下问题,有一个基于Timer 的替代解决方案:
但是,我更喜欢基于时间线的解决方案,而不是该问题的计时器解决方案。 Timer 需要一个新线程并额外注意确保更新发生在 JavaFX 应用程序线程上,而基于 Timeline 的解决方案不需要任何这些。
【讨论】:
正如Adowarth 评论的那样:
如果您在 完成处理程序
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();
【讨论】: