似乎无法实例化非空 FXMLLoader
Cannot seem to instantiate a non-null FXMLLoader
我已经阅读了一些关于此主题的相关 post,但无法使用它们来解决我的问题。我相信我的失败是一种理解,而不是我面临一个独特的问题。但是,我完全陷入了僵局。
我正在使用 JavaFX 构建一个 CRUD 应用程序。我的应用程序按钮之一 "Import Data," 抛出 NullPointerExceptions:
// *a button that opens a new window with a textField where the user can paste text data*
@FXML
private void importDataButton(ActionEvent event) {
// *load the fxml file*
URL viewLocation = getClass().getResource("/importView.fxml");
// *get the file's controller*
FXMLLoader loader = new FXMLLoader();
ImportController importController = loader.getController();
importController.setMainController(this);
loader.setLocation(viewLocation);
try {
loader.load();
} catch (IOException exception) {
System.out.println("IO Exception thrown.");
return;
}
....
}
我还不太熟悉 IntelliJ 的调试器,但我已经用它来确定 FXMLLoader 对象是否为空。所以当
importController.setMainController(this);
执行,抛出 NullPointerException,因为 this 引用的对象为 null。我认为。那么
ImportController importController = loader.getController();
无法从 FXMLLoader 对象(加载程序)检索控制器。
作为参考,setMainController()在另一个名为ImportController的class中,该方法的代码如下:
public void setMainController(MainController mainController) {
this.mainController = mainController;
}
我尝试过的事情:
我读了 and this post,他们都建议我必须 运行 loader.load() [给定 FXMLLoader loader = new FXMLLoader()] 才能从对象中检索数据.但是,我已经尝试过这个,并且我只是在错误时得到错误:InvocationTargetExceptions 和 IllegalStateExceptions。我还尝试使用
实例化一个非空的 FXMLLoader 对象
FXMLLoader load = new FXMLLoader(getClass.getResource("sample.fxml"));
但它似乎对对象的内容没有影响(是的,我正在用我的文件名替换 "sample.fxml"。)
我不想做类似的post,但我不知道该怎么做。
问题是您在 loader.load()
之前调用 loader.getController()
。这就是为什么你的 importController
在调用 importController.setMainController(this)
.
时为 null
先呼叫loader.load()
:
URL viewLocation = getClass().getResource("/importView.fxml");
FXMLLoader loader = new FXMLLoader(viewLocation);
try {
loader.load();
ImportController importController = loader.getController();
importController.setMainController(this);
} catch (IOException exception) {
exception.printStackTrace();
}
但请注意,ImportController
中的 initialize()
方法在 setMainController()
之前被调用。
我已经阅读了一些关于此主题的相关 post,但无法使用它们来解决我的问题。我相信我的失败是一种理解,而不是我面临一个独特的问题。但是,我完全陷入了僵局。
我正在使用 JavaFX 构建一个 CRUD 应用程序。我的应用程序按钮之一 "Import Data," 抛出 NullPointerExceptions:
// *a button that opens a new window with a textField where the user can paste text data*
@FXML
private void importDataButton(ActionEvent event) {
// *load the fxml file*
URL viewLocation = getClass().getResource("/importView.fxml");
// *get the file's controller*
FXMLLoader loader = new FXMLLoader();
ImportController importController = loader.getController();
importController.setMainController(this);
loader.setLocation(viewLocation);
try {
loader.load();
} catch (IOException exception) {
System.out.println("IO Exception thrown.");
return;
}
....
}
我还不太熟悉 IntelliJ 的调试器,但我已经用它来确定 FXMLLoader 对象是否为空。所以当
importController.setMainController(this);
执行,抛出 NullPointerException,因为 this 引用的对象为 null。我认为。那么
ImportController importController = loader.getController();
无法从 FXMLLoader 对象(加载程序)检索控制器。
作为参考,setMainController()在另一个名为ImportController的class中,该方法的代码如下:
public void setMainController(MainController mainController) {
this.mainController = mainController;
}
我尝试过的事情:
我读了
FXMLLoader load = new FXMLLoader(getClass.getResource("sample.fxml"));
但它似乎对对象的内容没有影响(是的,我正在用我的文件名替换 "sample.fxml"。)
我不想做类似的post,但我不知道该怎么做。
问题是您在 loader.load()
之前调用 loader.getController()
。这就是为什么你的 importController
在调用 importController.setMainController(this)
.
先呼叫loader.load()
:
URL viewLocation = getClass().getResource("/importView.fxml");
FXMLLoader loader = new FXMLLoader(viewLocation);
try {
loader.load();
ImportController importController = loader.getController();
importController.setMainController(this);
} catch (IOException exception) {
exception.printStackTrace();
}
但请注意,ImportController
中的 initialize()
方法在 setMainController()
之前被调用。