FXMLLoader找不到fxml文件-Maven项目

时间:2019-04-11 10:13:40

标签: java maven javafx fxmlloader

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

  

应用程序启动方法异常

据我了解,因为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(..)上方的行上运行了不同的sysout(一次一次):

    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"));

对于所有控制台输出是:(显然不是预期的输出)

  

所以,我的问题是

为什么.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)
  • OS:macOS Mojave-v10.14.3

1 个答案:

答案 0 :(得分:1)

  1. 我认为您的主要问题是图书馆“ ikonli”。如果尝试使用scenebuilder打开fxml,则会看到异常。我的建议是您失去这种依赖性。使用更简单的内容,例如svg图形:

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

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

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

  1. 我建议您从主控制器类加载fxml。在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. 您的控制器应像这样扩展根容器:

    公共类MainController扩展了VBox {

然后在主类中将主控制器传递给场景

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

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

软件包zenit.ui;

公共类启动器{

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

}

希望这会有所帮助!