未知路径 FXML 文档

Unknown Path FXML document

我们正在使用 JavaFX 编写 Java 应用程序。此时我们有3种不同的形式:

对于我们的下一次迭代,我们想要实现注册表单,但是我们得到了 IOException 错误 Unknown Path

关于这段代码:

FXMLLoader registrationLoader = new FXMLLoader();
                    try{
                        mainroot = (Parent)registrationLoader.load(this.getClass().getResource("FXMLRegistration.fxml").openStream());                            
                        Stage registrationStage = new Stage();
                        Scene scene = new Scene(mainroot);
                        registrationStage.setScene(scene);
                        registrationStage.setTitle("Register your account");
                        registrationStage.show();
                    } catch(IOException ex)
                    {
                        System.out.print(ex.getMessage());
                    }

当我将 FXMLRegistration.fxml 更改为 FXMLDocument.fxmlFXMLLoader.fxml.

时,以上代码有效

当我改变

mainroot = (Parent)registrationLoader.load(this.getClass().getResource("FXMLRegistration.fxml").openStream());

mainroot = (Parent)registrationLoader.load(Paths.get("src/hackattackfx/FXMLRegistration.fxml").toUri().toURL());

source

我在调试器输出中得到了绝对路径,当我在终端中将它与 file 命令一起使用时,这是正确的。

我希望有人能帮助我们解决这个错误。

提前致谢!

编辑

我将一些代码更改为以下内容:

FXMLLoader registrationLoader = new FXMLLoader(getClass().getResource("/FXMLRegistration.fxml"));
mainroot = (Parent)registrationLoader.load();   

但这将 return 一个 IllegalStateException: Location is not set。 当我在 /FXMLRegistration.fxml 之前删除 / 时,我到达我的 catch 块打印文件的完整路径:

file:/Users/juleskreutzer/Documents/github/PTS3/HackAttackFX/dist/run1793658053/HackAttackFX.jar!/hackattackfx/FXMLRegistration.fxml

同时将路径更改为 src/hackattackfx/FXMLRegistration.fxml 将给出 IllegalStateException: Location not set.

项目结构

我们在我们的应用程序中使用不同的包。所有这些包都在默认包中:hackattackfx

默认包中的包是:

我的 FXML 文档位于默认包 (hackattackfx) 中。如果不是 100% 清楚我是如何安排文件的,请查看 my Github repo

所以,我很好奇地想找出根本原因,我克隆了 repo,发现实际问题是以下错误以及 OP 在问题中发布的错误

Caused by: java.lang.NullPointerException at hackattackfx.FXMLRegistrationController.initialize(FXMLRegistrationController.java:67)

这意味着在控制器中 pane 为空。

这是因为 fxml 缺少 fx:id 的声明。

fx:id="pane" 添加到 FXMLRegistration.fxml 的 AnchorPane 声明中,一切正常。

您的路径需要从 /

开始

这对我有用:

final String fxmlPath = "/fxml/Main.fxml";
final FXMLLoader loader = new FXMLLoader(this.getClass().getResource(fxmlPath));

Main.fxml 位于资源文件夹中(对我来说:/src/main/resources/fxml/