如何在一个类中加载几个FXML?

时间:2015-04-24 13:42:19

标签: javafx fxml scenebuilder fxmlloader

我使用SceneBuilder创建多个组件,我的目标是使用所有这些文件来创建完整窗口。但我无法加载多个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();

此处返回错误

  

已指定根值。

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

1 个答案:

答案 0 :(得分:2)

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

因为FXMLLoader的生命周期如果可以重复使用会非常复杂,所以设置rootcontroller不止一次是错误的。 (如果controller设置为新值,root会发生什么?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();