You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:57:03