如何在资源文件夹中引用javafx fxml文件?

j w*_*ill 28 java resources javafx buildpath fxml

我正在创建一个javafx GUI应用程序,我的项目是一个maven配置的项目.我希望能够在我的控制器中引用我的fxml文件:

FXMLLoader.load(getClass().getResource("main.fxml"); 
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

在此输入图像描述

但我仍然有一个错误.

jew*_*sea 88

用法示例

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load(); 
Run Code Online (Sandbox Code Playgroud)

位置分辨率选项

  1. 将所有fxml放在src/main/resources目录中.

    loader.setLocation(getClass().getResource("/main.fxml"));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将所有fxml放在src/main/resources/fxml目录中.

    loader.setLocation(getClass().getResource("/fxml/main.fxml"));
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将fxml放在相应的资源目录中; 例如src/main/resources/com/mycompany/myapp.

    loader.setLocation(getClass().getResource("main.fxml")); 
    
    Run Code Online (Sandbox Code Playgroud)

最后一个选项假定您从中加载fxml的类位于相应Java源层次结构中的相同相对位置.例如,您可以从源调用上一个加载命令com.mycompany.myapp.Main.java.

FXMLLoader使用建议

  1. 通过new FXMLLoader()而不是使用FXMLLoader上的静态方法来实例化FXMLLoader.

    • 当您想要从加载器中获取值(如实例化控制器)时,静态方法会变得混乱.
  2. 在实例化的FXMLLoader上设置位置并调用 load()而不是使用从流加载 load(stream).

    • 在加载器上设置基于URL的位置允许解析fxml和css文件中加载的相对资源.基于流的构造函数不会解析相对资源.
  3. 要根据类派生位置,请使用 getClass().getResource()基于URL的,而不是 getClass().getResourceAsStream()基于流的.

IDE和构建设置

确保您的IDE或构建工具正在将fxml文件从资源目录复制到构建输出目录.要了解Intellij设置,请参阅:如何将intellij中的普通java项目转换为JavaFx项目.

  • 谢谢Felix,修复并澄清了答案.3年和28年的投票,没有人在原来的答案中指出这个异常;-) (2认同)

Dil*_*Dil 5

您正在FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("main.fxml") );用来加载main.fxml。这需要main.fxml和java类将其加载到同一目录/路径中。如果要从不同于加载Java类的路径/位置加载fxml文件,则需要使用相对路径。如上文@jewelsea所述,您可以在main.fxml之前使用/字符来使用相对路径。因此,适合您的情况的代码是

FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/main.fxml") );
Run Code Online (Sandbox Code Playgroud)