JavaFX FXMLLoader getController NullPointerException

问题描述 投票:1回答:2

我在学校有一个项目,我必须开发一个程序,您首先可以选择是要保存/读取/从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")
javafx nullpointerexception controller fxml fxmlloader
2个回答
0
投票

首先,要了解这个问题,你应该做一些技巧来检测你的问题在哪里。当你这样做时:

 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();
        }

1
投票

你正在调用静态方法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();
© www.soinside.com 2019 - 2024. All rights reserved.