我正在创建一个 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 文件放在主资源文件夹的相应目录中:
但我仍然遇到错误。
原文由 j will 发布,翻译遵循 CC BY-SA 4.0 许可协议
通用资源查找信息
这个答案讨论了 FXML 位置查找,它实际上只是 Java 中通用资源查找任务的一个子集。资源位置由调用程序作为 FXMLLoader 的输入传递,因此资源查找本身是调用应用程序代码的一部分,而不是 FXMLLoader。
要全面了解 Java/JavaFX 应用程序的通用资源信息(包括推荐的故障排除步骤),请参阅:
Eden 编码资源指南也很有用:
用法示例
位置解析选项
最后一个选项假定您从中加载 fxml 的类位于相应 Java 源层次结构中的相同相对位置。例如,您可以从源调用最后一个加载命令
com/mycompany/myapp/Main.java
。FXMLLoader 使用建议
通过
new FXMLLoader()
实例化 FXMLLoader,而不是使用 FXMLLoader 上的静态方法。在实例化的 FXMLLoader 上 设置位置 并调用
load()
而不是使用load(stream)
从流中加载。要基于类派生位置,请使用
getClass().getResource()
,因为它是基于 URL 的,而不是getClass().getResourceAsStream()
是基于流的。IDE 和构建设置
确保您的 IDE 或构建工具正在将 fxml 文件从资源目录复制到构建输出目录。要了解 Intellij 对此的设置,请参阅: How to convert a normal java project in intellij into a JavaFx project 。
关于 Java Jigsaw 模块化应用程序的注释
看:
具体来说,不要写:
而是写:
也就是说,直接从类中获取资源,而不是从类加载器中获取。如果您从类加载器而不是类获取资源,那么基于模块配置的查找会有额外的限制。这些限制可能很难理解,如有需要,请参阅
Class
和ClassLoader
getResource
方法的文档以获取信息。