JavaFX项目中如何在另一类中访问指定类的ObservableList类型成员变量data
解决方案
你可以通过以下几种成熟的JavaFX跨控制器数据共享方案获取Test类中的data变量值:
方案1:直接传递控制器引用(最适配当前场景)
你在加载两个窗口的FXML时,保存对应控制器的实例,直接在需要用到data的控制类中传入Test类的实例即可:
- 首先修改负责另一窗口的控制类,添加成员变量接收
Test实例
public class OtherWindowController { // 接收Test类实例 private Test mainWindowController; // 提供set方法注入实例 public void setMainWindowController(Test mainWindowController) { this.mainWindowController = mainWindowController; } // 需要用data的位置直接调用即可 public void targetButtonHandle() { ObservableList<ObservableList> data = mainWindowController.data; // 后续写你的业务逻辑即可 } }
- 然后在加载两个窗口的代码位置(一般是主类的start方法或者窗口打开的触发逻辑里)注入实例:
// 先加载主窗口的FXML得到Test控制器 FXMLLoader mainLoader = new FXMLLoader(getClass().getResource("test.fxml")); Parent mainRoot = mainLoader.load(); Test testController = mainLoader.getController(); // 加载另一窗口的FXML得到对应控制器 FXMLLoader otherLoader = new FXMLLoader(getClass().getResource("other_window.fxml")); Parent otherRoot = otherLoader.load(); OtherWindowController otherController = otherLoader.getController(); // 注入主窗口控制器实例 otherController.setMainWindowController(testController);
方案2:使用共享数据单例模型
如果你的多个窗口都需要共享大量数据,可以单独做一个全局的共享数据类,所有控制器都操作这个类的同一份实例:
// 单例共享数据类 public class SharedDataHolder { private static final SharedDataHolder INSTANCE = new SharedDataHolder(); // 存储你需要共享的data private ObservableList<ObservableList> queryData = FXCollections.observableArrayList(); private SharedDataHolder() {} public static SharedDataHolder getInstance() { return INSTANCE; } public ObservableList<ObservableList> getQueryData() { return queryData; } public void setQueryData(ObservableList<ObservableList> queryData) { this.queryData.setAll(queryData); } }
- 在Test类的
handleRunButton方法最后,把data存入共享类:
// handleRunButton方法最后添加 SharedDataHolder.getInstance().setQueryData(data);
- 在另一窗口的控制类中直接取即可:
ObservableList<ObservableList> data = SharedDataHolder.getInstance().getQueryData();
额外说明
- 因为
data是ObservableList类型,你如果需要在另一窗口监听data的变化自动更新UI,可以给它添加ListChangeListener,不需要每次主动拉取最新值。 - 不推荐用静态变量直接存储
data,容易造成内存泄漏,也不符合JavaFX的MVC设计规范。
内容的提问来源于stack exchange,提问作者Azad
相关产品推荐
相关产品推荐

