0

我盯着我的代码,但我很困惑一个问题:我想做一个淡出转换,我想在淡出转换运行时阻塞当前线程。所以,我的尝试是创建一个 CountDownLatch,它会阻塞线程,直到调用 transition.setOnFinished(),我在其中创建了一个 latch.countdown()。简而言之:我想确保过渡始终全长可见。

对我来说似乎很简单,但是...... setOnFinished() 没有被调用,因为上面提到的当前线程被倒计时锁存器阻塞。

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

 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();
            }
        }
    }
4

1 回答 1

0

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

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

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

于 2013-08-23T07:34:56.263 回答