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();
}
任何想法如何我可以解決這個問題?
如果加載'Persondata.fxml'需要很長的時間,因爲某些原因,你需要在後臺線程來執行它,而不是在FX應用程序線程上。另外,除了調用'loader.load()'之外,還需要調用'loader.getController()'。它會按照您調用它的方式返回null。 –
謝謝James_D。但是我怎樣才能實現後臺線程?是不是已經用Platform.runLater()....完成了? – user3006108
不,'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花費很長時間才能加載。爲什麼在這種情況下發生這種情況? –