无法指向新加载的 FXML 的 JavaFX 控制器的地址
Not possible to point to the adress of the JavaFX-controller of a newly loaded FXML
我正在加载几个 FXML 文件并尝试在它们各自的控制器中设置成员。然而,在一些神秘的情况下,我无法指向加载的 FXML 的控制器。起初我以为它只是实现 'Initialize' 的控制器,但经过一些测试后,情况并非如此。
这是一些代码和核心堆栈:
public void showLoginScreen() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/Login.fxml"));
mMainScene.setRoot((Parent) loader.load());
LoginController controller = loader.<LoginController>getController();
//I am able to reach the controller from here
controller.initManager(this);
} catch (IOException ex) {
Logger.getLogger(ControllerManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void showMainView(String sessionID) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/Main.fxml"));
mMainController = loader.<MainController>getController();
mMainScene.setRoot((Parent) loader.load());
//TODO : I am not able to reach the controller from here
System.out.println("pointer adress = " + mMainController);
mMainController.initManager(this);
} catch (IOException ex) {
Logger.getLogger(ControllerManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
核心堆栈:
pointer adress = null
Caused by: java.lang.NullPointerException
at controller.ControllerManager.showMainView(ControllerManager.java:40)
at view.LoginController.handle(LoginController.java:49)
... 58 more
在第二种情况下,您试图在加载 FXML 之前检索控制器。由于控制器 class 是在 FXML 文件中定义的,加载器在加载 FXML 之前无法实例化它。
只需更改方法调用的顺序:
public void showMainView(String sessionID) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/Main.fxml"));
// mMainController = loader.<MainController>getController();
mMainScene.setRoot((Parent) loader.load());
mMainController = loader.<MainController>getController();
System.out.println("pointer adress = " + mMainController);
mMainController.initManager(this);
} catch (IOException ex) {
Logger.getLogger(ControllerManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
我正在加载几个 FXML 文件并尝试在它们各自的控制器中设置成员。然而,在一些神秘的情况下,我无法指向加载的 FXML 的控制器。起初我以为它只是实现 'Initialize' 的控制器,但经过一些测试后,情况并非如此。
这是一些代码和核心堆栈:
public void showLoginScreen() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/Login.fxml"));
mMainScene.setRoot((Parent) loader.load());
LoginController controller = loader.<LoginController>getController();
//I am able to reach the controller from here
controller.initManager(this);
} catch (IOException ex) {
Logger.getLogger(ControllerManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void showMainView(String sessionID) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/Main.fxml"));
mMainController = loader.<MainController>getController();
mMainScene.setRoot((Parent) loader.load());
//TODO : I am not able to reach the controller from here
System.out.println("pointer adress = " + mMainController);
mMainController.initManager(this);
} catch (IOException ex) {
Logger.getLogger(ControllerManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
核心堆栈:
pointer adress = null
Caused by: java.lang.NullPointerException
at controller.ControllerManager.showMainView(ControllerManager.java:40)
at view.LoginController.handle(LoginController.java:49)
... 58 more
在第二种情况下,您试图在加载 FXML 之前检索控制器。由于控制器 class 是在 FXML 文件中定义的,加载器在加载 FXML 之前无法实例化它。
只需更改方法调用的顺序:
public void showMainView(String sessionID) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/Main.fxml"));
// mMainController = loader.<MainController>getController();
mMainScene.setRoot((Parent) loader.load());
mMainController = loader.<MainController>getController();
System.out.println("pointer adress = " + mMainController);
mMainController.initManager(this);
} catch (IOException ex) {
Logger.getLogger(ControllerManager.class.getName()).log(Level.SEVERE, null, ex);
}
}