通用资源查找信息
这个答案讨论了 FXML 位置查找,它实际上只是 Java 中通用资源查找任务的一个子集。调用程序将资源位置作为输入传递给 FXMLLoader,因此资源查找本身是调用应用程序代码的一部分,而不是 FXMLLoader。
有关 Java/JavaFX 应用程序的通用资源信息(包括推荐的故障排除步骤)的全面介绍,请参阅:
伊甸园编码资源指南也很有用:
示例用法
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load();
位置分辨率选项
将所有 fxml 放在 src/main/resources 目录中。
loader.setLocation(getClass().getResource("/main.fxml"));
将所有 fxml 放在 src/main/resources/fxml 目录中。
loader.setLocation(getClass().getResource("/fxml/main.fxml"));
将fxml放在对应的资源目录中;例如 src/main/resources/com/mycompany/myapp。
loader.setLocation(getClass().getResource("main.fxml"));
最后一个选项假定您从中加载 fxml 的类位于相应 Java 源层次结构中的相同相对位置。例如,您可能会从 source 调用最后一个加载命令com/mycompany/myapp/Main.java
。
FXMLLoader 使用建议
通过new FXMLLoader()
而不是使用 FXMLLoader 上的静态方法来实例化 FXMLLoader。
在实例化的 FXMLLoader 上
设置位置load()
并调用而不是使用
load(stream)
.
- 在加载器上设置基于 URL 的位置允许解析在 fxml 和 css 文件中加载的相关资源。相对资源不会为基于流的构造函数解析。
要基于类派生位置,请使用
getClass().getResource()
,因为它是基于 URL 的,而不是
getClass().getResourceAsStream()
基于流的。
IDE 和构建设置
确保您的 IDE 或构建工具正在将 fxml 文件从资源目录复制到构建输出目录。要了解 Intellij 的设置,请参阅:如何将 intellij 中的普通 java 项目转换为 JavaFx 项目。
关于 Java Jigsaw 模块化应用程序的说明
看:
具体来说,不要写:
ComboBoxStyling.class.getClassLoader()
.getResource("/css/styleclass.css");
而是写:
ComboBoxStyling.class
.getResource("/css/styleclass.css");
也就是说,直接从类中获取资源,而不是从类加载器中获取。如果您从类加载器而不是类中获取资源,那么基于模块配置的查找会有额外的限制。这些限制可能很难理解,如果需要,请参阅文档Class
和方法以获取信息。ClassLoader
getResource