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

dad*_*dox 6 java concurrency javafx

我的场景仅包含一个显示图像的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();
Run Code Online (Sandbox Code Playgroud)

我的问题是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();
Run Code Online (Sandbox Code Playgroud)

如何正确等待?谢谢

Ulu*_*Biy 18

好吧,如果你ft2ft1那时的反光动画

ft1.setAutoReverse(true);
ft1.setCycleCount(1);
// Or
// ft1.setCycleCount(Timeline.INDEFINITE);
// to loop infinitely (blinking effect) until stop()
Run Code Online (Sandbox Code Playgroud)

而你没有ft2.如果你还需要ft2玩的ft1

ft1.setOnFinished(new EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event) {
        ft2.play();
    }
});
Run Code Online (Sandbox Code Playgroud)


jew*_*sea 4

在 JavaFX 应用程序线程上忙等待(甚至 Thread.sleep)总是一个坏主意 - 您绑定了处理 UI 处理的线程,因此您的转换以及 UI 的其余部分永远不会更新 - 有效地冻结您的繁忙等待期间的应用程序 UI。对于响应式 UI,您需要尽快在 FX 应用程序线程上运行逻辑,然后让该线程运行,以便 JavaFX 系统的其余部分可以继续处理。这就是为什么转换有异步回调——一旦你习惯了它们,这是一种非常自然的开发方式。

除了 Uluk 的解决方案(非常棒)之外,您还可以查看SequentialTransition类,以获取按顺序执行转换的帮助。请注意,如果您想在 SequentialTransition 完成后执行操作,您仍然需要向 SequentialTransition 添加一个 onFinished 处理程序以在那时执行操作。