为了账号安全,请及时绑定邮箱和手机立即绑定

多个带有控制器的FXML,共享对象

多个带有控制器的FXML,共享对象

慕勒3428872 2019-11-12 12:41:31
各位晚上好,我已经找到了大量关于此主题的帖子,但是我仍然无法设法将对象从Controller1传递到Controller2。是否有某个完整的教程或一些示例项目可以做到这一点?我已经走了这么远,直到被卡住:国家级public class Country {private SimpleStringProperty country = new SimpleStringProperty("");//Constructorpublic Country() {}//GETTERSpublic String getCountry() {    return country.get();}//SETTERSpublic void setCountry(String value) {    country.set(value);}@Overridepublic String toString() {    return getCountry();}}程序启动时,将加载主FXML(Sample.fxml)。它包含一个边框窗格,该窗格的顶部是菜单栏,中间是内容窗格。在初始化时,我创建一个新的Country对象并将其存储在全局变量中。当单击菜单项时,我有一种将另一个FXML加载到内容窗格中的方法:SampleController.javapublic class SampleController implements Initializable {@FXMLprivate Pane pContent;private Country c;@FXMLprivate void handleButtonAction(ActionEvent event) throws IOException {    System.out.println(c); //this prints Belgium, which is correct    URL url = getClass().getResource("Sub1.fxml");    FXMLLoader fxmlloader = new FXMLLoader();    fxmlloader.setLocation(url);    fxmlloader.setBuilderFactory(new JavaFXBuilderFactory());    pContent.getChildren().clear();    pContent.getChildren().add((Node) fxmlloader.load(url.openStream()));}@Overridepublic void initialize(URL url, ResourceBundle rb) {    c = new Country();    c.setCountry("Belgium");}public Country getCountryFromSampleController(){    return c;}}现在,我希望在Sub1.fxml加载时捕获Country对象,这意味着我需要在initialize()上获取country对象:Sub1Controller.javapublic class Sub1Controller implements Initializable {/** * Initializes the controller class. */@Overridepublic void initialize(URL url, ResourceBundle rb) {    SampleController sp = new SampleController(); //I don't know how to fetch the original SampleController object    System.out.println(sp.getCountryFromSampleController());     //this prints null, which is ofcourse logical because I make a new SampleController object.         }    }我有一个问题,如何获取“原始” SampleController对象,以便可以使用getCountryFromRoot()方法来获取具有比利时值的Country对象?我一直在这个问题上搜索了好几个小时,并阅读了有关StackOverflow的每篇文章,但是看来我找不到丢失的链接...感谢任何帮助(最好是使用此代码)!很长的帖子,很抱歉,我试图尽可能完整,否则我将永远无法理解...
查看完整描述

3 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

FXML是MVC模式的一种简单形式。FXML文件是一个视图,Controller很明显,错过了什么?模型-一个用于存储相对于当前视图的所有数据的位置,因此可以在控制器之间共享国家/地区数据。


1.引入模型的一种可能方法是“上下文”。让我们考虑一个案例,那么整个项目只有一个模型,因此可以以Singleton的形式拥有全局上下文


public class Context {

    private final static Context instance = new Context();


    public static Context getInstance() {

        return instance;

    }


    private Country country = new Country();


    public Country currentCountry() {

        return country;

    }

}

您的SampleController将进行以下更改:


@Override

public void initialize(URL url, ResourceBundle rb) {

    Context.getInstance().currentCountry().setCountry("Belgium");

}

并SubController1可以以相同的方式访问它:


@Override

public void initialize(URL url, ResourceBundle rb) {

    System.out.println(Context.getInstance().currentCountry().getCountry());

}

2.另一种方法是将上下文传递给SubController1您,然后加载它的xml。如果您不想拥有应用程序全局模型,它将更好地工作。因此,创建类似的Context类,但不包含实例字段,并且:


public class Sub1Controller implements Initializable {

    private Context context;

    public void setContext(Context context) {

        this.context = context;

        // initialize country dependent data here rather then in initialize()

    }

}

在中设置上下文SampleController:


Context currentContext = new Context();


@Override

public void initialize(URL url, ResourceBundle rb) {

    currentContext.currentCountry().setCountry("Belgium");

}


@FXML

private void handleButtonAction(ActionEvent event) throws IOException {

    URL url = getClass().getResource("Sub1.fxml");


    FXMLLoader fxmlloader = new FXMLLoader();

    fxmlloader.setLocation(url);

    fxmlloader.setBuilderFactory(new JavaFXBuilderFactory());


    pContent.getChildren().clear();

    pContent.getChildren().add((Node) fxmlloader.load(url.openStream()));

            // here we go

    ((Sub1Controller)fxmlloader.getController()).setContext(currentContext);

}


查看完整回答
反对 回复 2019-11-12
?
暮色呼如

TA贡献1853条经验 获得超9个赞

感谢谢尔盖一百万次,终于一切都说得通了。这是我第一次必须创建一个大型应用程序,但是我仍在努力“构建”它。我还想问另一个安全性问题,但是我不确定这是否是问这个问题的正确网站(它与代码无关)

查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 647 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信