我正盯着我的代码而且我很困惑一个问题: 我希望进行淡出过渡,并且我想阻止当前线程,同时淡入淡出过渡正在运行。 所以,我的尝试是创建一个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();
}
}
}
答案 0 :(得分:0)
您只能在JavaFX应用程序线程上修改和查询活动场景图。您的所有代码都与场景图一起使用,因此所有代码都必须在JavaFX应用程序线程上运行。如果所有内容都已在JavaFX应用程序线程上运行,则代码中没有与并发相关的构造的原因。
如果使用latch.await()
等阻塞调用,则会阻止JavaFX应用程序线程,这将阻止运行任何渲染,布局或动画步骤。不应在此上下文中使用CountdownLatch
,应将其从代码中删除。
调用Platform.runLater
是不必要的,因为它的目的是在JavaFX应用程序线程上运行代码,并且您已经在JavaFX应用程序线程上。不应在此上下文中使用Platform.runLater
,应将其从代码中删除。