2017-02-06 6 views
-2
... 
public ProgressBar loadProgressBar; 
... 
Task task = new Task<Void>() 
    { 
     @Override 
     public Void call() 
     { 
      Platform.runLater(() 
        -> 
        { 

         Stage stage = new Stage(); 
         Group root = new Group(); 
         Scene scene = new Scene(root, 2000, 2000, Color.BLACK); 
         stage.setTitle("JavaFX Scene Graph Demo"); 
         stage.setScene(scene); 
         stage.setMaximized(true); 
         // stage.show(); 

         Label tempLbl = new Label(); 
         double h=0; 
         root.getChildren().add(tempLbl); 
         tempLbl.setText(""); 
         for (int i = 0; i < 10000000; i++) 
         { 
          tempLbl.setText(tempLbl.getText()+"asd"); 
          root.applyCss(); 
          root.layout(); 
          w=w+tempLbl.getHeight(); 
          updateProgress(i, 10000000); 
         } 
      }); 
      return null; 
     } 

    }; 

    loadProgressBar.progressProperty().bind(task.progressProperty()); 
    new Thread(task).start(); 

Если удалить Platform.runLater tempLbl.getHeight() всегда равен 0. Если оставить Platform.runLater loadProgressBar не обновляется до тех пор, пока не достигнет 100%. Как этого избежать?JavaFX: новый UI нить

+0

Можете ли вы хотя бы объяснить, что, по вашему мнению, должен делать этот код? –

+0

Это упрощенная версия. Полная версия текста берется, разбивается на страницы в соответствии с шрифтом, высотой и длиной. Каждый раз, когда страница оказывается разной, в зависимости от настроек. Код просто должен принимать и считать. Но без торможения второго потока или как я этого не делал. – Artyom

+0

Я понимаю, что это, вероятно, просто образец, но код совершенно не имеет смысла. Зачем создавать что-то для работы в фоновом потоке, который просто поворачивается и выполняет все это на потоке приложения FX? –

ответ

0

Ну::

1) Использование JavaFX Service рекомендуется.

2) Когда вы пытаетесь изменить JavaFX Scene с внешней резьбой необходимо использовать Platform.runLater(..)

3) Если вы хотите, чтобы увидеть прогресс меняющийся добавить Thread.sleep(50), например, в цикле. Без сна вы увидите только прогресс, когда он достигнет 100%

4) Некоторые из методов Task<?> разрешены для вызова из внешней темы, а некоторые нет. Им, которым разрешено, если вы видите внутренний код, который они вызывают Platform.isJavaFXThread(), а если нет, то они используют Platform.runLater();

+1

Я стараюсь. Спасибо – Artyom

+0

@Artyom Я также рекомендую вам книгу «Метро 2033», так как у вас одноименное имя с базовым актером. – GOXR3PLUS