亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

多個帶有控制器的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 關注
  • 669 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號