【问题标题】:FXML loader can't find .fxml file in the project with modulesFXML 加载器在带有模块的项目中找不到 .fxml 文件
【发布时间】:2019-08-09 01:21:28
【问题描述】:

我有一个具有这种结构的项目:

我尝试使用以下代码从 Main 类加载 sample.fxml:

Parent root = FXMLLoader.load(Main.class.getResource("../../submodule/src/java/sample.fxml"));

但它不起作用。 sample.fxml 文件代码为:

<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>


<GridPane fx:controller="sample.Controller"
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10"    vgap="10">
</GridPane>

问题是 FXML 加载器找不到这个位置。如何解决?

【问题讨论】:

  • 将 FXML 文件移动到 resources 目录中。然后使用getClass().getResource("/sample.fxml") 应该可以工作——假设两个模块在运行时都在类路径上。
  • @Slaw 不幸的是它没有帮助。
  • 你的项目结构看起来有点奇怪。您的主模块是 Maven 父模块吗?
  • 模块与否:class.getResource(...) 支持 ".." - 实际上,我不明白为什么每个人似乎都认为它确实如此 - 只需阅读 api 文档,你没有看到什么;)

标签: java javafx fxml fxmlloader


【解决方案1】:

我建议遵循基本的 maven 包结构,如下所示:

src
 |--main
      |--java
      |--resource (put your FXML file into this folder)

那么以下应该可以工作:

Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("sample.fxml"));

您也可以将 FXML 文件放入子文件夹:

... = FXMLLoader.load(getClass().getClassLoader().getResource("layouts/sample.fxml"));

这是一个链接,显示 getClass().getResource()getClass.getClassLoader().getResource() 之间的区别 (区别在于相对路径和绝对路径。如果您总是想从 Maven 项目中的 /resources 目录开始,则应该使用 getClass().getClassLoader().getResource()

What is the difference between Class.getResource() and ClassLoader.getResource()?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-01
    • 2014-04-27
    • 2017-02-04
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多