2015-08-31 82 views
1

在我的JavaFX應用程序中,我希望顯示一箇中間ProgressIndicator,例如從數據庫加載數據。我試圖通過設置一個不同的fxml文件(indicator.fxml)來解決這個問題,該文件包含一個帶有中間屬性的ProgressIndicator,放入主BorderPane中。之後,將期望的舞臺設置到BorderPane中。Java中的併發性(FX)

indicator.fxml顯示,但似乎被凍結,因爲它不是動畫。 PersondataController controller = 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.load()'之外,還需要調用'loader.getController()'。它會按照您調用它的方式返回null。 –

+0

謝謝James_D。但是我怎樣才能實現後臺線程?是不是已經用Platform.runLater()....完成了? – user3006108

+2

不,'Platform.runLater()'顯式運行FX應用程序線程上的代碼(請閱讀[documentation](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();