未知路径FXML文档

时间:2015-11-09 16:09:03

标签: java javafx fxml fxmlloader

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

  • 登录
  • 游戏窗口
  • 注册

对于我们的下一次迭代,我们要实现Registration表单,但是我们得到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();   

但是这将返回IllegalStateException:未设置Location。 当我在/之前移除/FXMLRegistration.fxml时,我会到我的catch块打印文件的完整路径:

  

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

同时将路径更改为src/hackattackfx/FXMLRegistration.fxml将导致IllegalStateException:未设置位置。

项目结构

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

默认包中的包是:

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

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

2 个答案:

答案 0 :(得分:1)

所以,我很好奇地找出了根本原因,我克隆了回购,发现实际问题是以下错误和OP在问题中发布的错误 < / p>

  

引起:java.lang.NullPointerException       在hackattackfx.FXMLRegistrationController.initialize(FXMLRegistrationController.java:67)

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

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

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

答案 1 :(得分:0)

您需要使用/

开始您的路径

这对我有用:

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

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