如何引用资源文件夹中的JavaFXML文件?

如何引用资源文件夹中的JavaFXML文件?,java,resources,javafx,fxml,buildpath,Java,Resources,Javafx,Fxml,Buildpath,我正在创建一个JavaFXGUI应用程序,我的项目是一个maven配置的项目。我希望能够在控制器中引用我的fxml文件,如下所示: FXMLLoader.load(getClass().getResource("main.fxml"); 其中,my main.fxml文件位于src/main/resources文件夹中,而我的控制器位于src/main/java文件夹中。我该怎么做呢?我的src/main/resources文件夹位于构建路径中,我可以从src/main/java文件夹中的类

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

FXMLLoader.load(getClass().getResource("main.fxml"); 
其中,my main.fxml文件位于src/main/resources文件夹中,而我的控制器位于src/main/java文件夹中。我该怎么做呢?我的src/main/resources文件夹位于构建路径中,我可以从src/main/java文件夹中的类调用src/main/resources文件夹中的.properties文件

编辑

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

但是我仍然有一个错误。

示例用法

位置分辨率选项

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

    loader.setLocation(getClass().getResource("/main.fxml"));
    
    loader.setLocation(getClass().getResource("/fxml/main.fxml"));
    
  • 将所有fxml放在src/main/resources/fxml目录中

    loader.setLocation(getClass().getResource("/main.fxml"));
    
    loader.setLocation(getClass().getResource("/fxml/main.fxml"));
    
  • 将fxml放在相应的资源目录中;e、 g.src/main/resources/com/mycompany/myapp

    loader.setLocation(getClass().getResource("main.fxml")); 
    
  • 最后一个选项假设从中加载fxml的类位于相应Java源层次结构中的相同相对位置。例如,您可以从source
    com/mycompany/myapp/Main.java
    调用最后一个load命令

    FXMLLoader使用建议

  • 通过
    新建FXMLLoader()
    而不是使用 这个

    • 静态方法 当你想(比如实例化)时会变得混乱 控制器)从装入器中取出
  • 在实例化的FXMLLoader和调用 而不是使用

    • 在加载程序上设置基于URL的位置可以解析 fxml和css文件中加载的相对资源。相对的 资源不解析为基于流的构造函数
  • 要基于类派生位置,请使用 ,因为它是基于URL的,而不是 它是基于流的

  • IDE和生成设置


    确保IDE或生成工具正在将fxml文件从资源目录复制到生成输出目录。要了解此设置的Intellij,请参阅:。

    您正在使用的
    FXMLLoader FXMLLoader=new FXMLLoader(getClass().getResource(“main.fxml”)
    加载main.fxml。这需要main.fxml和java类将其加载到相同的目录/路径中。 如果要从与加载fxml文件的java类不同的路径/位置加载fxml文件,则需要使用相对路径。 正如上面提到的@jewelsea,您可以在main.fxml之前使用/character来使用相对路径。 因此,在您的案例中,使其适用于您的代码是

    FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/main.fxml") );
    

    在操作系统的文件资源管理器中打开资源文件夹。在这里,您将看到您创建了一个“dominion.application”文件夹,而不是“dominion”文件夹中的“application”文件夹。因此,“MainController”类与fxml文件放在不同的包中。

    在示例中,您仍然使用静态方法。您需要调用getResourceAsStream而不是GetResource感谢Felix,修复并澄清了答案。3年28票,之前没有人在原始答案中指出这种反常现象;-)一直以来,它都失败了,因为我没有将
    /
    放在开始文件夹之前。例如,
    getClass().getResource(“fxml/main.fxml”)
    。对于NetBeans用户,您可以通过右键单击项目目录>属性>选择“源”>选择要添加到源>添加文件夹的文件夹,将现有文件夹添加到src。因此,如果您的fxml中已经有一个文件夹要引用,您可以添加该文件夹并调用带有其相对路径的fxml文件。实际上,这是问题的简单答案,只要您仔细考虑一下,也是有意义的。该路径相对于调用FXMLLoader()的源文件。