我正在创建一个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文件放在主资源文件夹的相应目录中:
但是我还是得到了一个错误。
发布于 2013-10-26 13:10:29
通用资源查找信息
这个答案讨论了FXML位置查找,它实际上只是Java中通用资源查找任务的一个子集。资源位置由调用程序作为输入传递给FXMLLoader,因此资源查找本身是调用应用程序代码的一部分,而不是FXMLLoader。
有关Java/JavaFX应用程序的通用资源信息(包括建议的故障排除步骤)的全面介绍,请参阅:
示例用法
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load();
位置分辨率选项
loader.setLocation(getClass().getResource("/main.fxml"));
loader.setLocation(getClass().getResource("/fxml/main.fxml"));
loader.setLocation(getClass().getResource("main.fxml"));
最后一个选项假设您从中加载fxml的类在相应的Java源代码层次结构中处于相同的相对位置。例如,您可以从源com/mycompany/myapp/Main.java
调用最后一个加载命令。
FXMLLoader使用建议
而是通过new FXMLLoader()
实例化new FXMLLoader()
- The static methods become confusing when you want to [get values](http://docs.oracle.com/javafx/2/api/javafx/fxml/FXMLLoader.html#getController%28%29) (like instantiated controllers) out of a loader.
在实例化的FXMLLoader上执行
load()
,而不是使用load(stream)
.从流中加载
- Setting a URL based location on the loader allows for resolution of relative resources loaded in fxml and css files. Relative resources do not resolve for a stream based constructor.
getClass().getResource()
,因为它是基于URL的,而不是使用基于流的getClass().getResourceAsStream()
。IDE和构建设置
确保IDE或构建工具正在将fxml文件从资源目录复制到构建输出目录。要了解Intellij的设置,请参阅:How to convert a normal java project in intellij into a JavaFx project。
关于Java Jigsaw模块化应用程序的说明
请参见:
具体来说,不要写:
ComboBoxStyling.class.getClassLoader()
.getResource("/css/styleclass.css");
相反,可以这样写:
ComboBoxStyling.class
.getResource("/css/styleclass.css");
也就是说,直接从类获取资源,而不是从类加载器获取资源。如果您从类加载器而不是类获取资源,则根据模块配置对查找有额外的限制。这些限制可能很难理解,如果需要,请参阅Class
和ClassLoader
getResource
方法的文档以获取信息。
发布于 2013-10-27 13:37:48
您正在使用FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("main.fxml") );
加载您的main.fxml。这需要main.fxml和java类将其加载到同一目录/路径中。如果您希望从与加载它的java类不同的路径/位置加载fxml文件,则需要使用相对路径。正如上面提到的@珠宝海,你可以在你的main.fxml前使用/字符的相对路径。因此,在您的情况下,让它为您工作的代码是
FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/main.fxml") );
发布于 2013-11-19 17:59:11
在操作系统的文件资源管理器中打开资源文件夹。在这里你会看到你已经创建了一个"dominion.application“文件夹,而不是一个"dominion”文件夹中的“应用程序”文件夹。因此,"MainController“类被放在与fxml文件不同的包中。
https://stackoverflow.com/questions/19602727
复制相似问题