首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX FXMLLoader getController NullPointerException

JavaFX FXMLLoader getController NullPointerException
EN

Stack Overflow用户
提问于 2017-12-14 12:59:29
回答 2查看 1.4K关注 0票数 1

我在学校有一个项目,在这个项目中,我必须开发一个程序,您首先可以选择是保存/读到/从SQL DB保存还是保存/读取到XML。

我已经制作了一个GUI,您可以在这两种方法之间进行选择。

用户单击其中一个按钮并打开MainMenu GUI后,GUI就会关闭。现在,我需要在MainMenuController中知道用户的选择。我在网上找到了一种在第一个控制器中调用MainMenuController的方法,即使用FXMLLoader.getController()

代码语言:javascript
复制
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

代码语言:javascript
复制
public class MainMenuController {   
    private String save = null;

    public void setSave(String save) {
        this.save=save;
    }
    public String getSave() {
        return save;
    }
}

但是,当我试图访问MainMenuController中的方法时,我会得到一个

代码语言:javascript
复制
mc.setSave("sql")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-14 15:19:03

首先,要理解这个问题,您应该使用一些技巧来检测您所做的problem.When在哪里:

代码语言:javascript
复制
 System.out.println(mc);

您会发现结果是null.So,您不能用null对象调用setSave("sql"),因为您没有指定文件的位置,所以获得了一个空控制器,但是您可以更改一些行以解决问题:

代码语言:javascript
复制
 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
EN

Stack Overflow用户

发布于 2017-12-14 14:54:32

您正在调用静态方法FXMLLoader.load(URL)。因为这是一个静态方法,所以它对您创建的FXMLLoader实例的状态没有任何影响;具体来说,没有设置控制器字段。

相反,在FXMLLoader实例上设置位置,并调用实例方法load()

代码语言:javascript
复制
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("MainMenu.fxml"));
// or just FXMLLoader loader = new FXMLLoader(getClass().getResource("MainMenu.fxml"));

Parent root = loader.load();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47813995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档