java - 如何引用资源文件夹中的javafx fxml文件?

标签 java resources javafx fxml buildpath

我正在创建一个javafx GUI应用程序,我的项目是一个maven配置的项目。我希望能够在我的 Controller 中引用我的 fxml 文件,如下所示:

FXMLLoader.load(getClass().getResource("main.fxml")); 

我的 main.fxml 文件位于 src/main/resources 文件夹中,我的 Controller 位于 src/main/java 文件夹中。我该怎么做呢?我的 src/main/resources 文件夹位于构建路径中,我可以从 src/main/java 文件夹中的类调用 src/main/resources 文件夹中的 .properties 文件。

编辑

我尝试将fxml文件放在主资源文件夹的相应目录中:

enter image description here

但我仍然遇到错误。

最佳答案

通用资源查找信息

这个答案讨论了 FXML 位置查找,它实际上只是 Java 中通用资源查找任务的一个子集。资源位置由调用程序作为 FXMLLoader 的输入传递,因此资源查找本身是调用应用程序代码的一部分,而不是 FXMLLoader。

有关 Java/JavaFX 应用程序的通用资源信息(包括建议的故障排除步骤)的全面介绍,请参阅:

Eden 编码资源指南也很有用:

<小时/>

用法示例

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load(); 

位置解析选项

  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. 通过 new FXMLLoader() 实例化 FXMLLoader,而不是使用 static methods on the FXMLLoader .

    • 静态方法 当你想要 get values 时变得困惑(就像实例化的 Controller )从加载器中出来。
  2. Set the location在实例化的 FXMLLoader 上并调用 load()而不是使用从流加载 load(stream) .

    • 在加载器上设置基于 URL 的位置可以解析 fxml 和 css 文件中加载的相关资源。相对的 资源无法解析基于流的构造函数。
  3. 要根据类派生位置,请使用 getClass().getResource() ,因为它是基于 URL 的,而不是 getClass().getResourceAsStream()这是基于流的。

IDE 和build设置

确保您的 IDE 或构建工具正在将 fxml 文件从资源目录复制到构建输出目录。要了解 Intellij 的设置,请参阅:How to convert a normal java project in intellij into a JavaFx project .

关于 Java Jigsaw 模块化应用程序的说明

参见:

具体来说,不要写:

ComboBoxStyling.class.getClassLoader()
    .getResource("/css/styleclass.css");

而是写:

ComboBoxStyling.class
    .getResource("/css/styleclass.css"); 

也就是说,直接从类获取资源,而不是从类加载器获取资源。如果您从类加载器而不是类获取资源,则基于模块配置的查找会受到其他限制。这些限制可能很难理解,请参阅 Class 的文档和 ClassLoader如果需要,getResource 方法获取信息。

关于java - 如何引用资源文件夹中的javafx fxml文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60908745/

相关文章:

c# - 从资源加载图像

css - 如何在 JavaFX 的 tabPane 中删除这个额外的空间?

java - 如何创建自己的按钮并将其与 Scene Builder for javafx 一起使用

java - 如何在 javafx 浏览器中操作链接

java - 如何在多个持久化上下文中以事务方式持久化对象?

c# - 将 using 语句与 WinForms 一起使用……好的做法?

java - Dropwizard 配置不适用于 Shaded jar

html - 如何将不同文件中的 <div> 加载到我的页面中

java - 使用 2-way SSL Handskake(客户端和服务器证书)设置 Netty

java - 我的vps有足够的内存,但vm无法运行