0

我用 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();

这是返回的错误

已指定根值。

我应该为每个组件创建一个加载器吗?

4

1 回答 1

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();
于 2015-04-24T17:02:01.003 回答