似乎无法实例化非空 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() 之前被调用。