0

我们正在使用 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.fxmlFXMLDocument.fxmlor时,上面的代码正在工作FXMLLoader.fxml

当我改变

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

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

资源

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

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

提前致谢!

编辑

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

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

但这将返回 IllegalStateException: Location is not set。当我删除/before/FXMLRegistration.fxml时,我会看到我的 catch 块打印文件的完整路径:

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

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

项目结构

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

默认包中的包是:

  • 默认包
    • 例外
    • 接口
    • 枚举
    • 资源
    • 模板
  • JSON 包

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

4

2 回答 2

1

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

原因:hackattackfx.FXMLRegistrationController.initialize(FXMLRegistrationController.java:67) 处的 java.lang.NullPointerException

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

这是因为 fxml 缺少fx:id.

添加fx:id="pane"到 AnchorPane 声明中FXMLRegistration.fxml,事情应该可以正常工作。

于 2015-11-09T18:09:42.217 回答
0

你需要开始你的路径 /

这对我有用:

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

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

于 2015-11-09T18:15:09.493 回答