java - FXMLLoader 找不到 fxml 文件 - Maven 项目

标签 java maven javafx fxmlloader

当我在 Maven 项目中运行主类时,我得到:

Exception in Application start method

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

这是文件系统层次结构

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

在 Eclipse 中(在 src 内)

enter image description here

enter image description here

阅读apache's maven guideother 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")在这里返回null

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

我的系统:

  • Maven:Apache Maven 3.6.0
  • Java SE:11.0.2
  • JavaFX:11.0.2
  • Eclipse:2018-12 (4.10.0)
  • 操作系统:macOS Mojave - v10.14.3

最佳答案

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

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

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

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

  • 我建议您从主 Controller 类加载 fxml。在 fxml 中检查属性 fxroot 并向主 Controller 添加一个构造函数,如下所示
  • 公共(public)MainController(){

    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
        loader.setController(this);
        loader.setRoot(this);
        loader.load();
    
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    }

  • 您的 Controller 应该像这样扩展根容器:

    公共(public)类 MainController 扩展了 VBox {

  • 然后在主类中将主 Controller 传递给场景

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

  • 最后一件事 - 您需要添加另一个名为 Launcher 的类 - 然后从中启动您的应用程序 - 不要从主类中删除 main 方法

  • 包 zenit.ui;

    公共(public)类启动器{

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

    }

    希望这有帮助!

    关于java - FXMLLoader 找不到 fxml 文件 - Maven 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55630040/

    相关文章:

    java - 为什么 intern 方法在 java 中不返回相等的字符串

    JavaFX:线程异常未记录到系统输出

    Java 8 分组并附加到集合

    java - Guice Java 提供了没有已知依赖性的方法?

    maven - Maven/Gradle方法来计算包括所有传递依赖项的依赖项总大小

    android - gradle如何两次解析具有不同版本的同一个lib,并在运行时使用两者?

    java - 项目构建错误 : Non-parseable POM/pom. xml : entity reference name can not contain character =' (position: START_TAG seen . ..)

    java - 这个fxml错误代码在JavaFx中意味着什么

    java - 使用 JavaFX 中另一个打开的窗口中的对象填充 ListView

    java - 将 java.lang.String 转换为 Scala 字符串