JavaFX FXMLLoader getController NullPointerException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaFX FXMLLoader getController NullPointerException相关的知识,希望对你有一定的参考价值。
我在学校有一个项目,我必须开发一个程序,您首先可以选择是要保存/读取/从SQL DB读取还是从XML保存/读取。
我已经制作了一个GUI,您可以在两种方法之间进行选择。
用户单击其中一个按钮并打开MainMenu GUI后,GUI将关闭。现在我需要在MainMenuController
中了解用户选择的内容。我在网上找到了一个方法,用MainMenuController
调用第一个控制器内的FXMLLoader.getController()
。
try {
Stage stage = new Stage();
FXMLLoader Loader = new FXMLLoader();
Parent root = Loader.load(getClass().getResource("MainMenu.fxml"));
MainMenuController mc = Loader.getController();
mc.setSave("sql");
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
catch (Exception e) {
e.printStackTrace();
}
MainMenuController
public class MainMenuController {
private String save = null;
public void setSave(String save) {
this.save=save;
}
public String getSave() {
return save;
}
}
但是,当我尝试访问MainMenuController
中的方法时,我得到了一个NullPointerException
mc.setSave("sql")
答案
首先,要了解这个问题,你应该做一些技巧来检测你的问题在哪里。当你这样做时:
System.out.println(mc);
你会发现结果是null
.So你不能用setSave("sql")
对象调用null
,你有一个空控制器,因为你没有指定你的文件的位置,但你可以改变一些行来解决你的问题:
try {
Stage stage = new Stage();
FXMLLoader fxm = new FXMLLoader(getClass().getResource("MainMenu.fxml"));
Parent parent = (Parent) fxm.load();
Scene scene = new Scene(parent);
stage.setScene(scene);
stage.show();
FirstController mc = fxm.getController();
System.out.println(mc);
mc.setSave("sql");
} catch (Exception e) {
e.printStackTrace();
}
另一答案
你正在调用静态方法FXMLLoader.load(URL)
。因为这是一个静态方法,所以它对你创建的FXMLLoader
实例的状态没有影响;特别是没有设置控制器字段。
相反,在FXMLLoader
实例上设置位置,并调用实例方法load()
:
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("MainMenu.fxml"));
// or just FXMLLoader loader = new FXMLLoader(getClass().getResource("MainMenu.fxml"));
Parent root = loader.load();
以上是关于JavaFX FXMLLoader getController NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章