如何在资源文件夹中引用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选项
-
把所有的fxml放在src / main / resources目录下。
loader.setLocation(getClass().getResource("/main.fxml"));
-
把所有的fxml放在src / main / resources / fxml目录下。
loader.setLocation(getClass().getResource("/fxml/main.fxml"));
-
将fxml放在相应的资源目录中; 例如src / main / resources / com / mycompany / myapp。
loader.setLocation(getClass().getResource("main.fxml"));
最后一个选项假设您要从中加载fxml的类位于相应的Java源代码层次结构中的相同位置。 例如,您可能会从源com.mycompany.myapp.Main.java
调用最后一个加载命令。
FXMLLoader使用build议
-
通过
new FXMLLoader()
实例化一个FXMLLoader,而不是在FXMLLoader上使用静态方法 。- 当你想从加载器中获取值 (如实例化的控制器)时,静态方法会变得混乱。
-
设置实例化的FXMLLoader上的位置并调用
load()
而不是使用load(stream)
从stream中load(stream)
。- 在加载器上设置一个基于URL的位置可以parsing在fxml和css文件中加载的相关资源。 相对资源不能parsing基于stream的构造函数。
-
要派生一个基于类的位置,使用
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文件放在不同的包中。