Java中的并发(FX)
在我的JavaFX应用程序中,我希望在从数据库加载数据时显示一个中间ProgressIndicator。我试图通过在主边框窗格中设置一个不同的fxml文件(indicator.fxml)来解决这个问题,该文件包含一个具有中间属性的ProgressIndicator。然后,在BorderPane中设置所需的阶段 indicator.fxml将显示,但似乎已冻结,因为它未设置动画。PersondataController=loader.getController()需要一些时间才能完成Java中的并发(FX),java,concurrency,javafx,Java,Concurrency,Javafx,在我的JavaFX应用程序中,我希望在从数据库加载数据时显示一个中间ProgressIndicator。我试图通过在主边框窗格中设置一个不同的fxml文件(indicator.fxml)来解决这个问题,该文件包含一个具有中间属性的ProgressIndicator。然后,在BorderPane中设置所需的阶段 indicator.fxml将显示,但似乎已冻结,因为它未设置动画。PersondataController=loader.getController()需要一些时间才能完成 @FXML
@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();
}
有什么办法可以解决这个问题吗?在你的帮助下终于解决了我的问题。谢谢你们 而不是我做的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();
Service backgroundThread=新服务(){
@凌驾
受保护的任务createTask(){
返回新任务(){
@凌驾
受保护的Void调用()引发异常{
FXMLLoader loader2=新的FXMLLoader();
loader2.setLocation(RootLayoutController.class.getResource(“Persondata.fxml”);
PersondataController=loader2.getController();
page=loader2.load();
返回null;
}
};
}
};
backgroundThread.SetonSucceed((evt)->{
mainApp.getRootLayout().setCenter(第页);
});
backgroundThread.start();
如果加载Persondata.fxml
需要很长时间,出于某种原因,您需要在后台线程中执行,而不是在FX应用程序线程上执行。另外,在调用loader.load()
之后,还需要调用loader.getController()
。它只会以您所称的方式返回null
。谢谢您,James\u D。但是我如何实现后台线程呢?这不是已经在Platform.runLater()上完成了吗?不,Platform.runLater()
在FX应用程序线程上显式运行代码(请阅读)。使用并将其包装在线程中或在执行器中执行(同样,请参阅文档)。然而,fxmloader
需要很长时间才能加载,这是非常罕见的。为什么会发生这种情况?与您目前认为的完全相反的是,用户3006108。它将“在将来某个未指定的时间在JavaFX应用程序线程上运行指定的Runnable”,而不是在后台线程上运行逻辑。要了解如何使用后台线程并让它们与JavaFXAPI交互,请阅读我的猜测,这是需要很长时间的数据库加载,而不是FXML加载本身。也许用户在FXML控制器的初始化函数中编写了一些数据库逻辑。