由于某些原因,当我尝试加载位于其他程序包中的FXML时出现错误:
MainApp.java ”
while
文件夹结构:
错误消息:
FXMLLoader loader = new FXMLLoader();
System.out.println("view folder: " + MainApp.class.getResource("view/RootLayout.fxml")); // returns null
loader.setLocation(MainApp.class.getResource("view/RootLayout.fxml"));
答案 0 :(得分:1)
我可以告诉你什么对我有用。首先,应该将FXML文件而不是Java源文件视为资源,因此最好将它们放在自己的目录树中。您的源代码当前位于/src/main/java
树中,因此您的FXML文件应移至/src/main/resources
树中,最好移至名为fxml
的子目录中。 (我还有一个名为i18n
的子目录,该子目录保存资源束以定义多种语言的文本标签。)
一旦您的FXML文件位于路径/src/main/resources/fxml
下,您应该可以从JavaFX控制器使用以下方式加载它们:
FXMLLoader loader = new FXMLLoader();
URL fxmlLocation = getClass().getResource("/fxml/main_screen.fxml");
loader.setLocation(fxmlLocation);
loader.setController(mainScreenController);
loader.setResources(ResourceBundle.getBundle("i18n/Text", new Locale("sv", "SE")));
Pane pane = loader.<Pane>load();
Scene scene = new Scene(pane);
(如果FXML文件的根元素不代表Pane
,则需要修改调用load()
方法的行,并用适当的替换Pane
类型。)
请注意,对getResource(String)
的调用采用以正斜杠开头的路径,该路径代表资源路径根/src/main/resources/
。
还要注意,奇怪的是,即使您定位的是完全相同的getBundle(String)
路径,对/src/main/resources/
的调用也不会以正斜杠开头。我不得不承认我无法解释为什么这两种方法需要略有不同,如下所示,但是此代码可以加载“ main_screen.fxml”文件和瑞典语资源捆绑文件“ Text_sv_SE.properties”。 / p>
答案 1 :(得分:0)
任何遇到这种情况的人都可以尝试的另一件事是确保您的fxml文件不为空。在scenebuilder中将其打开,然后拖动“锚点”窗格。那就是对我有用的