如何在资源文件夹中引用JavaFX的FXML文件?
如何在资源文件夹中引用JavaFX的FXML文件?
我正在创建一个使用JavaFX的GUI应用程序,我的项目是一个配置了Maven的项目。我希望能够在我的控制器中像这样引用我的fxml文件:
FXMLLoader.load(getClass().getResource("main.fxml"));
我的main.fxml文件位于src/main/resources文件夹中,而我的控制器位于src/main/java文件夹中。我该如何操作?我的src/main/resources文件夹已经在构建路径中,我可以从src/main/java文件夹中的类调用位于src/main/resources文件夹中的.properties文件。
编辑
我尝试将fxml文件放在主资源文件夹的相应目录中:
但是仍然出现了错误。
问题的原因:在资源文件夹中创建了一个名为"dominion.application"的文件夹,而不是在一个名为"dominion"的文件夹内创建一个名为"application"的文件夹。由于这个原因,"MainController"类被放置在与fxml文件不同的包中。
解决方法:
1. 打开操作系统中的资源文件夹。
2. 在资源文件夹中创建一个名为"dominion"的文件夹。
3. 在"dominion"文件夹中创建一个名为"application"的文件夹。
4. 将"MainController"类移动到"dominion.application"包中。
5. 确保"MainController"类和fxml文件位于同一个包中。
这样做将解决"如何在资源文件夹中引用JavaFX FXML文件"的问题。
问题的出现原因:
该问题的出现是由于在JavaFX应用程序中引用FXML文件时出现了路径错误或资源文件无法找到的问题。
解决方法:
以下是解决该问题的几种方法:
1. 将所有的FXML文件放在src/main/resources目录下,并使用以下代码引用:
loader.setLocation(getClass().getResource("/main.fxml"));
2. 将所有的FXML文件放在src/main/resources/fxml目录下,并使用以下代码引用:
loader.setLocation(getClass().getResource("/fxml/main.fxml"));
3. 将FXML文件放在对应的资源目录中,例如src/main/resources/com/mycompany/myapp,并使用以下代码引用:
loader.setLocation(getClass().getResource("main.fxml"));
最后一种方法假设加载FXML的类与对应的Java源代码层次结构中的相对位置相同。例如,您可能会从源代码com/mycompany/myapp/Main.java中调用最后一个加载命令。
建议使用FXMLLoader的用法:
1. 实例化FXMLLoader时使用new FXMLLoader()
,而不是使用FXMLLoader上的静态方法。
2. 在实例化的FXMLLoader上设置位置并调用load()
,而不是使用流加载。
3. 要根据类获得位置,请使用getClass().getResource()
,而不是getClass().getResourceAsStream()
。
IDE和构建设置:
确保您的IDE或构建工具将FXML文件从资源目录复制到构建输出目录。有关此设置的Intellij设置,请参见文章中提供的链接。
关于Java Jigsaw模块化应用程序的说明:
在Java Jigsaw模块化应用程序中,需要注意资源的获取方式。具体来说,应该从类直接获取资源,而不是从类加载器获取。如果从类加载器获取资源,那么根据模块配置,查找将受到额外限制。
对于NetBeans用户的快速提示:
如果您使用的是NetBeans,可以通过右键单击项目目录 > 属性 > 选择“源” > 选择要添加到源的文件夹 > 添加文件夹 来将现有文件夹添加到src目录。因此,如果您已经有一个包含您要引用的FXML文件的文件夹,您可以直接将该文件夹添加并使用相对路径调用FXML文件。
以上是关于如何在JavaFX应用程序中引用FXML文件的解决方法和一些建议。希望能对您有所帮助!