无法在另一个包(JavaFX)中加载FXML

时间:2018-12-10 03:28:58

标签: java javafx fxml

由于某些原因,当我尝试加载位于其他程序包中的FXML时出现错误:

MainApp.java

while

文件夹结构:

enter image description here

错误消息:

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"));

2 个答案:

答案 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中将其打开,然后拖动“锚点”窗格。那就是对我有用的