有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java FXMLLoader找不到fxml文件Maven项目

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

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:ApacheMaven 3.6.0
  • Java SE:11.0.2
  • JavaFX:11.0.2
  • 月食:2018-12(4.10.0)
  • 操作系统:macOS Mojave-v10。14.3

共 (1) 个答案

  1. # 1 楼答案

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

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

      • 接下来添加另一个css属性-fx缩放形状>;并将其值设置为true

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

    1. 我建议您从主控制器类加载fxml。在fxml中,检查属性fxroot并向主控制器添加构造函数,如下所示

    公共主控制器(){

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

    }

    1. 控制器应扩展根容器,如下所示:

      公共类主控制器扩展VBox{

    然后在main类中,只需将主控制器传递给场景

    Scene scene = new Scene(controller);
    
    1. 我相信你的maven项目没有正确设置。您应该右键单击您的项目>;配置>;转换为maven项目。然后,如果包裹变红,请将其清理干净

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

    包装zenit。用户界面

    公共类启动器{

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

    }

    希望这有帮助