如何在一个 class 中加载多个 FXML?

How to load several FXML in one class?

我用 SceneBuilder 创建了几个组件,我现在的目标是使用所有这些文件创建一个完整的window .但是我无法加载多个 FXML,这是我尝试做的 :

    private MenuBar menuBar;
    private Pane filtersView;

    FXMLLoader loader = new FXMLLoader();

    loader.setLocation(MainWindow.class.getResource("../component/menuBar/MenuBar.fxml"));
    menuBar = (MenuBar) loader.load();

    loader.setLocation(MainWindow.class.getResource("../component/filtersView/FiltersView.fxml"));
    filtersView = (Pane) loader.load();

这是返回错误

Root value already specified.

我是否必须为每个组件创建一个加载程序

FXMLLoader 实例具有许多相互依赖的属性(例如 rootcontroller),这些属性通过解析 FXML 文件或以编程方式设置。这些中的每一个还以各种方式与 FXMLLoader 实例持有的 namespace 地图进行交互。

因为 FXMLLoader 的生命周期如果可以重复使用会非常复杂,所以多次设置 rootcontroller 是错误的. (如果 root 设置为新值,controller 会发生什么情况?namespace 中的属性会怎样?)。

因此,您应该只使用一次 FXMLLoader 实例。为每个要加载的 FXML 文件创建一个新的加载器:

FXMLLoader menuLoader = new FXMLLoader();

menuLoader.setLocation(MainWindow.class.getResource("../component/menuBar/MenuBar.fxml"));
menuBar = (MenuBar) menuLoader.load();

FXMLLoader filtersLoader = new FXMLLoader();
filtersLoader.setLocation(MainWindow.class.getResource("../component/filtersView/FiltersView.fxml"));
filtersView = (Pane) filtersLoader.load();