В моем приложении 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();
}
Любые идеи, как я могу решить эту проблему?
Если загрузка 'Persondata.fxml' занимает много времени, по какой-то причине, вы должны выполнить его в фоновом потоке, а не на тему приложения FX. Кроме того, в качестве отложенного вам нужно вызвать 'loader.getController()' после вызова 'loader.load()'. Он просто вернет 'null', как вы его называете. –
Спасибо James_D. Но как я могу достичь фонового потока? Разве это уже не сделано с Platform.runLater() ....? – user3006108
Нет, '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» очень тяжело загружаться. Почему это происходит в этом случае? –