2015-08-31 2 views
1

В моем приложении JavaFX я хочу отобразить промежуточный ProgressIndicator при загрузке данных из базы данных, например. Я попытался решить эту проблему, установив в основной BorderPane другой файл fxml (indicator.fxml), содержащий ProgressIndicator с промежуточным свойством. И после этого, установив желаемый этап в BorderPane.Параллельность в Java (FX)

Индикатор.fxml отображается, но кажется, что он заморожен, потому что он не анимируется. Контроллер PersondataController = loader.getController() занимает некоторое время для завершения.

@FXML 
private void showPersonData(){ 
    try{ 
     FXMLLoader loader2 = new FXMLLoader(); 
     loader2.setLocation(RootLayoutController.class.getResource("Indicator.fxml")); 
     AnchorPane progress = loader2.load(); 
     mainApp.getRootLayout().setCenter(progress);´ 

     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       FXMLLoader loader = new FXMLLoader(); 
       loader.setLocation(RootLayoutController.class.getResource("Persondata.fxml")); 
       PersondataController controller = loader.getController(); 

       AnchorPane page = null; 
       try { 
        page = loader.load(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       mainApp.getRootLayout().setCenter(page); 
      } 
     }); 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

Любые идеи, как я могу решить эту проблему?

+0

Если загрузка 'Persondata.fxml' занимает много времени, по какой-то причине, вы должны выполнить его в фоновом потоке, а не на тему приложения FX. Кроме того, в качестве отложенного вам нужно вызвать 'loader.getController()' после вызова 'loader.load()'. Он просто вернет 'null', как вы его называете. –

+0

Спасибо James_D. Но как я могу достичь фонового потока? Разве это уже не сделано с Platform.runLater() ....? – user3006108

+2

Нет, 'Platform.runLater()' явно запускает код в потоке приложения FX (прочитайте [документацию] (http://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform. HTML # runLater-java.lang.Runnable-)). Используйте ['Task'] (http://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html) и либо оберните его в поток, либо выполните в« Executor »(снова , см. документы). Однако для «FXMLLoader» очень тяжело загружаться. Почему это происходит в этом случае? –

ответ

1

Наконец-то решила моя проблема с вашей помощью. Спасибо вам, ребята.

Вместо Platform.runLater() вещи я сделал:

Service<Void> backgroundThread = new Service<Void>() { 
      @Override 
      protected Task<Void> createTask() { 
       return new Task<Void>() { 
        @Override 
        protected Void call() throws Exception { 
         FXMLLoader loader2 = new FXMLLoader(); 
         loader2.setLocation(RootLayoutController.class.getResource("Persondata.fxml")); 
         PersondataController = loader2.getController(); 
         page = loader2.load(); 
         return null; 
        } 
       }; 
      } 
     }; 

     backgroundThread.setOnSucceeded((evt) -> { 
      mainApp.getRootLayout().setCenter(page); 
     }); 
     backgroundThread.start();