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

时间:2013-10-26 04:13:43

标签: java resources javafx fxml buildpath

我正在创建一个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文件放在主资源文件夹的相应目录中:

enter image description here

但我仍然有错误。

3 个答案:

答案 0 :(得分:83)

示例用法

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 /主/资源/ COM / myCompany中/ MYAPP。

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

    FXMLLoader使用建议

    1. 通过new FXMLLoader()实例化FXMLLoader而不是使用 static methods on the FXMLLoader

      • 静态方法 当你想要get values时(比如实例化)会变得混乱 控制器)来自装载机。
    2. Set the location在实例化的FXMLLoader和调用上 load()而不是使用 load(stream)

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

    4. IDE和构建设置

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

在操作系统的文件资源管理器中打开资源文件夹。在这里你会看到你已经创建了一个" dominion.application"文件夹而不是"应用程序"文件夹里面有一个" dominion"夹。因为这个" MainController" class作为fxml文件放在不同的包中。