2013-10-26 107 views
18

我正在创建一个javafx GUI应用程序,我的项目是一个maven配置项目。我希望能够引用我FXML文件,这样在我的控制器:如何在资源文件夹中引用javafx fxml文件?

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

凡我main.fxml文件位于src /主/资源文件夹,我的控制器是在src/main/java下夹。我如何去做这件事?我的src/main/resources文件夹位于构建路径中,我可以从src/main/java文件夹中的类中调用src/main/resources文件夹中的.properties文件。

编辑

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

enter image description here

,但我仍然有一个错误。

回答

57

用法示例

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")); 
    

最后一个选项假设您要从中加载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()这是基于流。

IDE和构建设置

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

+0

你仍然在你的例子中使用静态方法。你需要调用getResourceAsStream而不是getResource –

+2

谢谢Felix,修复并澄清了答案。 3年和28个upvotes,之前没有人在原始答案中指出这种异常;-) – jewelsea

+0

所有这一次,它失败了,因为我没有在开始文件夹之前放置'/'。即'的getClass()。的getResource( “FXML/main.fxml”)'。 – sudoman

4

您正在使用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")); 
0

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