使用CountdownLatch的JavaFX FadeTransition.onSetOnFinished无法按预期工作

时间:2013-08-22 13:07:04

标签: animation concurrency javafx

我正盯着我的代码而且我很困惑一个问题: 我希望进行淡出过渡,并且我想阻止当前线程,同时淡入淡出过渡正在运行。 所以,我的尝试是创建一个CountDownLatch,它阻塞线程,直到调用transition.setOnFinished(),在那里我创建一个latch.countdown()。简而言之:我想确保过渡总是在全长中可见。

看起来很直接给我,但...... setOnFinished()不会被调用,因为上面提到的当前线程被倒计时锁存器阻止。

我该如何解决这个问题? Thx提前。

 private void initView() {
        Rectangle rect = new Rectangle();
        rect.widthProperty().bind(widthProperty());
        rect.heightProperty().bind(heightProperty());
        rect.setFill(Color.BLACK);
        rect.setOpacity(0.8f);

        getChildren().add(rect);

        MyUiAnimation animator = new MyUiAnimation();
        fadeInTransition = animator.getShortFadeInFor(this);

        fadeOutTransition = animator.getShortFadeOutFor(this);
        fadeOutTransition.setOnFinished(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent arg0) {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        latch.countDown();
                        setVisible(false);
                    }
                });
            }
        });
    }

public void hide() {
        fadeInTransition.stop();

        if (isVisible()) {
            latch = new CountDownLatch(1);
            fadeOutTransition.playFromStart();
            try {
                latch.await();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

您只能在JavaFX应用程序线程上修改和查询活动场景图。您的所有代码都与场景图一起使用,因此所有代码都必须在JavaFX应用程序线程上运行。如果所有内容都已在JavaFX应用程序线程上运行,则代码中没有与并发相关的构造的原因。

如果使用latch.await()等阻塞调用,则会阻止JavaFX应用程序线程,这将阻止运行任何渲染,布局或动画步骤。不应在此上下文中使用CountdownLatch,应将其从代码中删除。

调用Platform.runLater是不必要的,因为它的目的是在JavaFX应用程序线程上运行代码,并且您已经在JavaFX应用程序线程上。不应在此上下文中使用Platform.runLater,应将其从代码中删除。