2013-08-22 2 views
0

Я смотрю на свой код, и я довольно застрял в одной проблеме: Я хочу сделать переход с постепенным исчезновением, и я хочу заблокировать текущий поток, в то время как выполняется переход затухания. Итак, моя попытка состояла в том, чтобы создать CountDownLatch, который блокирует поток, пока не вызывается change.setOnFinished(), где я делаю latch.countdown(). Короче говоря, я хочу убедиться, что переход всегда отображается во всю длину.JavaFX FadeTransition.onSetOnFinished с CountdownLatch не работает должным образом

Казалось, что мне достаточно прямо, но ... 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

Вы можете изменять и запрашивать только активный график сцены в потоке приложения JavaFX. Весь ваш код работает с графиком сцены, поэтому все это должно запускаться в потоке приложений JavaFX. Если в потоке приложений JavaFX все уже запущено, в вашем коде нет причин для конструкций, связанных с параллелизмом.

Если вы используете блокирующие вызовы, такие как latch.await(), вы заблокируете поток приложений JavaFX, что предотвратит выполнение любых действий рендеринга, макета или анимации. CountdownLatch не должны использоваться в этом контексте и должны быть удалены из кода.

Вызов Platform.runLater не нужен, так как это цель - запустить код в потоке приложения JavaFX, и вы уже находитесь в потоке приложения JavaFX. Platform.runLater не должен использоваться в этом контексте и должен быть удален из кода.