我使用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();
此处返回错误:
已指定根值。
我是否必须为每个组件创建一个加载器?
答案 0 :(得分:2)
FXMLLoader
实例具有许多相互依赖的属性(例如root
和controller
),这些属性通过解析FXML文件或以编程方式设置。其中每个都以各种方式与namespace
实例持有的FXMLLoader
地图进行交互。
因为FXMLLoader
的生命周期如果可以重复使用会非常复杂,所以设置root
或controller
不止一次是错误的。 (如果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();