Java中的并发(FX)

Java中的并发(FX),java,concurrency,javafx,Java,Concurrency,Javafx,在我的JavaFX应用程序中,我希望在从数据库加载数据时显示一个中间ProgressIndicator。我试图通过在主边框窗格中设置一个不同的fxml文件(indicator.fxml)来解决这个问题,该文件包含一个具有中间属性的ProgressIndicator。然后,在BorderPane中设置所需的阶段 indicator.fxml将显示,但似乎已冻结,因为它未设置动画。PersondataController=loader.getController()需要一些时间才能完成 @FXML

在我的JavaFX应用程序中,我希望在从数据库加载数据时显示一个中间ProgressIndicator。我试图通过在主边框窗格中设置一个不同的fxml文件(indicator.fxml)来解决这个问题,该文件包含一个具有中间属性的ProgressIndicator。然后,在BorderPane中设置所需的阶段

indicator.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();
    }

有什么办法可以解决这个问题吗?

在你的帮助下终于解决了我的问题。谢谢你们

而不是我做的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控制器的初始化函数中编写了一些数据库逻辑。