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

各位晚上好,


我已经找到了大量关于此主题的帖子,但是我仍然无法设法将对象从Controller1传递到Controller2。是否有某个完整的教程或一些示例项目可以做到这一点?


我已经走了这么远,直到被卡住:


国家级


public class Country {

private SimpleStringProperty country = new SimpleStringProperty("");


//Constructor

public Country() {

}


//GETTERS

public String getCountry() {

    return country.get();

}


//SETTERS

public void setCountry(String value) {

    country.set(value);

}


@Override

public String toString() {

    return getCountry();

}

}

程序启动时,将加载主FXML(Sample.fxml)。它包含一个边框窗格,该窗格的顶部是菜单栏,中间是内容窗格。在初始化时,我创建一个新的Country对象并将其存储在全局变量中。当单击菜单项时,我有一种将另一个FXML加载到内容窗格中的方法:


SampleController.java


public class SampleController implements Initializable {


@FXML

private Pane pContent;


private Country c;


@FXML

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

}


@Override

public void initialize(URL url, ResourceBundle rb) {

    c = new Country();

    c.setCountry("Belgium");

}


public Country getCountryFromSampleController(){

    return c;

}

}

现在,我希望在Sub1.fxml加载时捕获Country对象,这意味着我需要在initialize()上获取country对象:


Sub1Controller.java


public class Sub1Controller implements Initializable {


/**

 * Initializes the controller class.

 */

@Override

public 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的每篇文章,但是看来我找不到丢失的链接...感谢任何帮助(最好是使用此代码)!


很长的帖子,很抱歉,我试图尽可能完整,否则我将永远无法理解...


慕勒3428872
浏览 648回答 3
3回答

BIG阳

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将进行以下更改:@Overridepublic void initialize(URL url, ResourceBundle rb) {    Context.getInstance().currentCountry().setCountry("Belgium");}并SubController1可以以相同的方式访问它:@Overridepublic 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();@Overridepublic void initialize(URL url, ResourceBundle rb) {    currentContext.currentCountry().setCountry("Belgium");}@FXMLprivate 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);}

暮色呼如

感谢谢尔盖一百万次,终于一切都说得通了。这是我第一次必须创建一个大型应用程序,但是我仍在努力“构建”它。我还想问另一个安全性问题,但是我不确定这是否是问这个问题的正确网站(它与代码无关)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java