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

我正在创build一个javafx GUI应用程序,我的项目是一个mavenconfiguration项目。 我想能够在我的控制器中像这样引用我的fxml文件:

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

我的main.fxml文件位于src / main / resources文件夹中,而我的控制器位于src / main / java文件夹中。 我怎么去做这个? 我的src / main / resources文件夹位于构buildpath中,我可以从src / main / java文件夹中的类中调用src / main / resources文件夹中的.properties文件。

编辑

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

在这里输入图像描述

但我仍然有一个错误。

用法示例

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

位置parsing选项

  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使用build议

  1. 通过new FXMLLoader()实例化一个FXMLLoader,而不是在FXMLLoader上使用静态方法 。

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

    • 在加载器上设置一个基于URL的位置可以parsing在fxml和css文件中加载的相关资源。 相对资源不能parsing基于stream的构造函数。
  3. 要派生一个基于类的位置,使用getClass().getResource() ,因为它是基于URL的,而不是基于stream的getClass().getResourceAsStream()

IDE和生成设置

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

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

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

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