FXMLLoader 找不到 fxml 文件 - Maven 项目

FXMLLoader won't find fxml file - Maven project

当我在 Maven 项目中 运行 main class 时,我得到:

Exception in Application start method

据我了解,这是因为无法加载 FXML 文件。

这是文件系统层次结构

 src
    └- main
        ├- java
        |   └- zenit
        |      └- ui
        |         └- TestUI.java
        └- resources
            └- zenit
               └- ui
                  └- Main.fxml

在 Eclipse 中(在 src 内)

阅读 apache's maven guide and other statck questions,下面的代码片段似乎是创建 FXMLLoader 并指向 Main.fxml 文件的正确方法。

public class TestUI extends Application {
    public void start(Stage stage) throws IOException {

        FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));

        .
        .   // set controller, load parent, set scene etc.
        .

    }

    public static void main(String[] args) {
        launch(args);
    }
}

但是这段代码会抛出前面提到的异常。

当我试图查明我的代码中 Exception 的来源时,我发现它来自 FXMLLoader。 所以我 运行 不同的系统输出(一次一个),在上面的行 FXMLLoader loader = new FXMLLoader(..) :

    System.out.println(getClass().getResource("Main.fxml"));
    System.out.println(getClass().getResource("main/resources/zenit/ui/Main.fxml"));
    System.out.println(getClass().getResource("../../../resources/zenit/ui/Main.fxml"));

总的来说,控制台输出是:(显然不是预期的输出)

null

所以,我的问题是,

这里为什么.getResource("Main.fxml")returnnull

在这种情况下如何正确访问 Main.fxml 文件?

我的系统:

  1. 我认为您的主要问题是库 "ikonli." 如果您尝试使用 scenebuilder 打开 fxml,您将看到异常。我的建议是您失去这种依赖性。使用更简单的东西,例如 svg 图形:

    • 在 fxml 按钮 > 添加区域 > 设置区域大小 > 然后在样式部分添加 css 属性 -fx-shape > 并在值中在引号中设置 svg 路径,即:"M827.6 ... 122z"

    • 接下来添加另一个css 属性 -fx-scale-shape > 并将其值设置为true

以上不需要任何第三方库,你可以在网上免费找到所有图标。

  1. 我建议您从主控制器加载您的 fxml class。在 fxml 中检查 属性 fxroot 并像这样
  2. 添加一个构造函数到你的主控制器

public MainController() {

try {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
    loader.setController(this);
    loader.setRoot(this);
    loader.load();

} catch (IOException e) {
    e.printStackTrace();
}

}

  1. 你的控制器应该像这样扩展根容器:

    public class MainController 扩展 VBox {

然后在main里class只要把主控制器传给场景就可以了

Scene scene = new Scene(controller);
  1. 我认为您的 Maven 项目设置不正确。您应该右键单击您的项目 > 配置 > 转换为 Maven 项目。如果包变红,则清理它们。

  2. 最后一件事 - 你需要添加另一个名为 Launcher 的 class - 然后你从它启动你的应用程序 - 不要从你的 main class[ 中删除 main 方法=13=]

包 zenit.ui;

public class 启动器 {

public static void main(String[] args) {
    TestUI.main(args);
}

}

希望对您有所帮助!