我们正在使用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.fxml
或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。
当我在/
之前移除/FXMLRegistration.fxml
时,我会到我的catch块打印文件的完整路径:
的文件:!/Users/juleskreutzer/Documents/github/PTS3/HackAttackFX/dist/run1793658053/HackAttackFX.jar /hackattackfx/FXMLRegistration.fxml
同时将路径更改为src/hackattackfx/FXMLRegistration.fxml
将导致IllegalStateException:未设置位置。
项目结构
我们在应用程序中使用不同的包。所有这些包都在默认包中:hackattackfx
默认包中的包是:
我的FXML文档位于默认包(hackattackfx)中。如果我不是100%清楚我如何安排我的文件,请查看my Github repo
答案 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/
)