如何等待转换在javafx 2.1中结束?


问题内容

我的场景仅包含一个ImageView,显示一个图像。我想将图像淡化为黑色(场景的指定颜色),然后过一段时间后,再次从黑色淡入图像。我发现FadeTransition非常适合此目的。这是我的一部分代码:

    // fade to black transition
    FadeTransition ft1 = new FadeTransition(Duration.millis(2000), myImageView);
    ft1.setFromValue(1.0);
    ft1.setToValue(0.0);
    ft1.play();

    // fade from black transition
    FadeTransition ft2 = new FadeTransition(Duration.millis(2000), myImageView);
    ft2.setFromValue(0.0);
    ft2.setToValue(1.0);
    ft2.play();

我的问题是ft1.play()异步的,因此下面的代码将在ft1.play()退出之前开始执行。结果,我只看到第二个过渡。如何等待第一个过渡结束,然后启动第二个过渡?我无法让线程在两者之间进入睡眠状态,因为它是主要的javafx线程(尝试过并且无法正常工作)。

我尝试将onFinishedProperty()方法与标志上的忙等待组合使用,但是我永远陷入了while循环中。这是我的代码:

    boolean isTransitionPlaying;
    FadeTransition ft = new FadeTransition(Duration.millis(2000), iv);
    ft.setFromValue(1.0);
    ft.setToValue(0.0);
    ft.onFinishedProperty().set(new EventHandler<ActionEvent>() {
        @Override 
        public void handle(ActionEvent actionEvent) {
            transitionPlaying = false;
        }
    });
    transitionPlaying = true;
    ft.play();

    while (transitionPlaying == true)
    {
        // busy wait
        System.out.println("still waiting...");
    }

    FadeTransition ft2 = new FadeTransition(Duration.millis(2000), iv);
    ft2.setFromValue(0.0);
    ft2.setToValue(1.0);
    ft2.play();

等待如何正确完成?谢谢


问题答案:

在JavaFX应用程序线程上忙于等待(甚至Thread.sleep)始终是一个坏主意-
您将负责处理UI处理的线程捆绑在一起,以便您的过渡以及UI的其余部分都不会更新-
有效地冻结了您的忙碌等待期间的应用程序用户界面。对于响应式UI,您需要尽快在FX应用程序线程上运行逻辑,然后放开线程,以便JavaFX系统的其余部分可以继续进行处理。这就是过渡具有异步回调的原因-
一旦您习惯了它们,这便是一种非常自然的开发方式。


除了Uluk的解决方案(很棒的解决方案)之外,您还可以查看SequentialTransition类,以处理按顺序执行过渡的协助。请注意,如果您想在SequentialTransition完成后采取行动,您仍将需要向onSequentialTransition添加onFinished处理函数以在此时采取行动。