JavaFX FXMLLoader getController NullPointerException
JavaFX FXMLLoader getController NullPointerException
我在学校有一个项目,我必须开发一个程序,你首先可以选择是要 save/read to/from SQL 数据库还是 save/read to/from 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();
}
主菜单控制器
public class MainMenuController {
private String save = null;
public void setSave(String save) {
this.save=save;
}
public String getSave() {
return save;
}
}
但是当我尝试访问 MainMenuController
中的方法时,我得到 NullPointerException
for
mc.setSave("sql")
您正在调用 static 方法 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();
首先,要了解这个问题,您应该使用一些技巧来检测您的 problem.When 在哪里:
System.out.println(mc);
你会发现结果是null
。所以你不能用null
对象调用setSave("sql")
,你得到一个空控制器,因为你没有指定文件的位置,但您可以更改一些行来解决您的问题:
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();
}
我在学校有一个项目,我必须开发一个程序,你首先可以选择是要 save/read to/from SQL 数据库还是 save/read to/from 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();
}
主菜单控制器
public class MainMenuController {
private String save = null;
public void setSave(String save) {
this.save=save;
}
public String getSave() {
return save;
}
}
但是当我尝试访问 MainMenuController
中的方法时,我得到 NullPointerException
for
mc.setSave("sql")
您正在调用 static 方法 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();
首先,要了解这个问题,您应该使用一些技巧来检测您的 problem.When 在哪里:
System.out.println(mc);
你会发现结果是null
。所以你不能用null
对象调用setSave("sql")
,你得到一个空控制器,因为你没有指定文件的位置,但您可以更改一些行来解决您的问题:
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();
}