【问题标题】:How to use PauseTransition method in JavaFX?如何在 JavaFX 中使用 PauseTransition 方法?
【发布时间】:2015-05-30 07:38:24
【问题描述】:

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

【问题讨论】:

    标签: javafx


    【解决方案1】:

    如何使用 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 的解决方案不需要任何这些。

    【讨论】:

    • 为了完整起见,如果我是正确的,如果你在完成处理程序中再次启动它,你可以使用 PauseTransition。
    【解决方案2】:

    正如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(); 
    

    【讨论】:

      猜你喜欢
      • 2020-09-23
      • 2019-10-19
      • 1970-01-01
      • 2023-04-08
      • 2020-07-24
      • 1970-01-01
      • 2013-06-01
      • 2021-07-03
      • 2016-09-27
      相关资源
      最近更新 更多