JavaFX-管理选项卡之间的对象

JavaFX-管理选项卡之间的对象,java,javafx,tabs,fxml,Java,Javafx,Tabs,Fxml,我有一个控制器,我们称之为GeneralController,它创建一个选项卡窗格以及两个新选项卡。新选项卡都有自己的控制器,“Tab1Controller”和“Tab2Controller”。 在GeneralController中,我创建了一个对象“MyObject”。此对象包含一些数据,可以在Tab1Controller和Tab2Controller中进行修改。 到目前为止,一切顺利 “Tab1Controller”和“Tab2Controller”都有一个initController函数

我有一个控制器,我们称之为GeneralController,它创建一个选项卡窗格以及两个新选项卡。新选项卡都有自己的控制器,“Tab1Controller”和“Tab2Controller”。 在GeneralController中,我创建了一个对象“MyObject”。此对象包含一些数据,可以在Tab1Controller和Tab2Controller中进行修改。 到目前为止,一切顺利

“Tab1Controller”和“Tab2Controller”都有一个initController函数,它以“MyObject”作为参数。这样,我可以用“MyObject”初始化两个控制器

通用控制器:

// Similar function for Tab2Controller
private void createTab1(ObjectProperty<MyObject> myObject) {
    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("path/to/tab1.fxml"));

        Tab tab1 = (Tab) loader.load();

        Tab1Controller tab1Controller = loader.getController();
        tab1Controller.initController(myObject)

        generalTabs.getTabs().add(tab1);
    }
    catch (IOException ex) {
        ex.printStackTrace();
    }
}
public void initController(ObjectProperty<MyObject> myObject) {
    this.myObject = myObject;
}
//Tab2Controller的类似功能
私有void createTab1(ObjectProperty myObject){
试一试{
FXMLLoader=新的FXMLLoader();
setLocation(Main.class.getResource(“path/to/tab1.fxml”);
Tab tab1=(Tab)loader.load();
Tab1Controller Tab1Controller=loader.getController();
tab1Controller.initController(myObject)
generalTabs.getTabs().add(tab1);
}
捕获(IOEX异常){
例如printStackTrace();
}
}
tab1控制器/tab2控制器:

// Similar function for Tab2Controller
private void createTab1(ObjectProperty<MyObject> myObject) {
    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("path/to/tab1.fxml"));

        Tab tab1 = (Tab) loader.load();

        Tab1Controller tab1Controller = loader.getController();
        tab1Controller.initController(myObject)

        generalTabs.getTabs().add(tab1);
    }
    catch (IOException ex) {
        ex.printStackTrace();
    }
}
public void initController(ObjectProperty<MyObject> myObject) {
    this.myObject = myObject;
}
public void initController(ObjectProperty myObject){
this.myObject=myObject;
}
我的问题来了: 如何以最佳方式确保标签、控件、节点、图表等在Tab1Controller和Tab2Controller中保持最新


在Tab1Controller和Tab2Controller中创建setOnSelectionChanged侦听器并更新所有可能的数据更改是否合理?

一个好的解决方案是使用。
如果您需要一个很好的示例,请看一看

,我认为在tab change listener上再次调用initController()就足够了。在更改侦听器中:newTab.initController(currentMyObject);当然,这是个不错的主意,谢谢!在我创建了这个问题几分钟后,我才意识到:在切换选项卡时,myObject总是最新的。我关心的是使我的所有控件、标签、图表等保持最新。我想,我可以在TabController中创建自己的变量,并通过myObject的绑定使它们保持最新。在changeListener中,我必须更新我的控件、标签等。这有意义吗?在调用initController(myObject)后,您如何在tab的第一个视图中初始化这些控件?TabController中的控件最初是使用GeneralController中的FXMLLoader创建的(参见初始帖子中的示例)。在TabController中,我仅使用“@FXML私有标签myControl”访问这些控件。在setOnSelectionChanged Listener中,当选择选项卡时,我必须使用修改后的myObject更新所有这些控件。我不知道这是解决这个问题的常用方法,还是我只是把它复杂化了。我的意思是,您是否设置为myConrtol.setText(myObject.getSomeValue());以某种方式?如果是,您可以使用currunt更新的myObject实例重新调用该方法。