首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何引用资源文件夹中的javafx fxml文件?

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

Stack Overflow用户
提问于 2013-10-26 12:13:43
回答 3查看 85.4K关注 0票数 46

我正在创建一个javafx GUI应用程序,我的项目是一个经过maven配置的项目。我希望能够在控制器中像这样引用我的fxml文件:

代码语言:javascript
复制
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文件放在主资源文件夹的相应目录中:

但是我还是得到了一个错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-26 13:10:29

通用资源查找信息

这个答案讨论了FXML位置查找,它实际上只是Java中通用资源查找任务的一个子集。资源位置由调用程序作为输入传递给FXMLLoader,因此资源查找本身是调用应用程序代码的一部分,而不是FXMLLoader。

有关Java/JavaFX应用程序的通用资源信息(包括建议的故障排除步骤)的全面介绍,请参阅:

示例用法

代码语言:javascript
复制
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load(); 

位置分辨率选项

  1. 将所有的fxml放在src/
  2. /resources目录中。

loader.setLocation(getClass().getResource("/main.fxml"));

  1. 将所有的fxml放在src/main/resources/fxml目录中。

loader.setLocation(getClass().getResource("/fxml/main.fxml"));

  1. 将fxml放在相应的资源目录中;例如src/main/resources/com/mycompany/myapp。

loader.setLocation(getClass().getResource("main.fxml"));

最后一个选项假设您从中加载fxml的类在相应的Java源代码层次结构中处于相同的相对位置。例如,您可以从源com/mycompany/myapp/Main.java调用最后一个加载命令。

FXMLLoader使用建议

  1. 不使用static methods on the FXMLLoader.

而是通过new FXMLLoader()实例化new FXMLLoader()

代码语言:javascript
复制
- 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上执行

  1. Set the location,并调用load(),而不是使用load(stream).

从流中加载

代码语言:javascript
复制
- 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.

  1. 要根据类派生位置,请使用getClass().getResource(),因为它是基于URL的,而不是使用基于流的getClass().getResourceAsStream()

IDE和构建设置

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

关于Java Jigsaw模块化应用程序的说明

请参见:

具体来说,不要写:

代码语言:javascript
复制
ComboBoxStyling.class.getClassLoader()
    .getResource("/css/styleclass.css");

相反,可以这样写:

代码语言:javascript
复制
ComboBoxStyling.class
    .getResource("/css/styleclass.css"); 

也就是说,直接从类获取资源,而不是从类加载器获取资源。如果您从类加载器而不是类获取资源,则根据模块配置对查找有额外的限制。这些限制可能很难理解,如果需要,请参阅ClassClassLoader getResource方法的文档以获取信息。

票数 116
EN

Stack Overflow用户

发布于 2013-10-27 13:37:48

您正在使用FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("main.fxml") );加载您的main.fxml。这需要main.fxml和java类将其加载到同一目录/路径中。如果您希望从与加载它的java类不同的路径/位置加载fxml文件,则需要使用相对路径。正如上面提到的@珠宝海,你可以在你的main.fxml前使用/字符的相对路径。因此,在您的情况下,让它为您工作的代码是

代码语言:javascript
复制
FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/main.fxml") );
票数 8
EN

Stack Overflow用户

发布于 2013-11-19 17:59:11

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19602727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档