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

JavaFX:单个Model下实现多TableView独立增删行的方法

解决方案:独立每个Tab的TableView数据源

核心问题在于所有TableView共用了同一个静态ObservableList,导致数据操作互相影响。解决思路是为每个Tab的TableView创建独立的数据源,并确保增删操作只针对当前TableView的专属数据源。

修改后的完整代码及注释:

// 移除静态全局数据源,改为每个TableView实例创建独立的ObservableList
// public static ObservableList<myModel> list = FXCollections.observableArrayList();

// 在@override initialize方法内
tabPane.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
    System.out.println("Tab selected: " + newValue.getText());

    if (newValue.getContent() == null) {
        System.out.println("New table created");
        TableView<myModel> tableView = new TableView<>();
        // 为当前TableView创建专属的数据源
        ObservableList<myModel> tableData = FXCollections.observableArrayList();
        tableView.setItems(tableData);

        // 初始化列定义(保留原有的列配置)
        TableColumn<myModel, String> columnA = new TableColumn<>("A");
        TableColumn<myModel, String> columnB = new TableColumn<>("B");
        TableColumn<myModel, String> columnC = new TableColumn<>("C");
        TableColumn<myModel, String> columnD = new TableColumn<>("D");
        TableColumn<myModel, String> columnE = new TableColumn<>("E");
        TableColumn<myModel, Button> columnF = new TableColumn<>("F");

        // 删除按钮的单元格工厂(原逻辑保留,因为已经是操作当前TableView的items)
        Callback<TableColumn<myModel, Button>, TableCell<myModel, Button>> btncellFactory = column -> new TableCell<>() {
            private final Button deleteBtn = new Button("Delete");

            {
                deleteBtn.setFocusTraversable(false);
                deleteBtn.setOnAction(event -> {
                    TableRow<myModel> row = getTableRow();
                    if (row != null && row.getItem() != null) {
                        // 直接操作当前TableView的数据源,不会影响其他TableView
                        getTableView().getItems().remove(row.getItem());
                    }
                });
            }

            @Override
            public void updateItem(Button item, boolean empty) {
                super.updateItem(item, empty);
                setGraphic(empty ? null : deleteBtn);
            }
        };

        // 绑定各列的单元格工厂(保留原有工厂类)
        columnA.setCellFactory(ACellFactory.cell());
        columnB.setCellFactory(BCellFactory.cell());
        columnC.setCellFactory(CCellFactory.cell());
        columnD.setCellFactory(DCellFactory.cell());
        columnE.setCellFactory(ECellFactory.cell());
        columnF.setCellFactory(btncellFactory);

        // 配置添加行按钮的点击事件:操作当前选中Tab的TableView数据源
        addRowBtn.setOnMouseClicked(mouseEvent -> {
            // 获取当前选中的Tab及其对应的TableView
            Tab selectedTab = tabPane.getSelectionModel().getSelectedItem();
            if (selectedTab != null && selectedTab.getContent() instanceof TableView) {
                @SuppressWarnings("unchecked")
                TableView<myModel> currentTable = (TableView<myModel>) selectedTab.getContent();
                // 添加新的myModel实例到当前TableView的专属数据源
                currentTable.getItems().add(new myModel(myModel.getA(), myModel.getB(), myModel.getC(), myModel.getD(), myModel.getE()));
            }
        });

        // 组装TableView的列
        tableView.getColumns().setAll(columnA, columnB, columnC, columnD, columnE, columnF);
        newValue.setContent(tableView);

    } else {
        System.out.println("Containing table: " + newValue.getContent());
    }
});

关键修改说明

  1. 移除静态全局数据源:删除原有的public static ObservableList<myModel> list,避免所有TableView共用同一数据集合。
  2. 为每个TableView创建独立数据源:在创建新TableView时,实例化专属的ObservableList<myModel> tableData并绑定到当前TableView。
  3. 修正添加行逻辑:点击添加按钮时,先获取当前选中的Tab对应的TableView,再往其专属数据源中添加数据,确保操作只影响当前Tab的表格。
  4. 优化删除逻辑:删除行时直接通过getTableView().getItems()操作当前表格的数据源,原逻辑本身是正确的,只是之前因为数据源共用导致了同步变化。

内容的提问来源于stack exchange,提问作者Hrithik_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:59:59