【问题标题】:Edit the cell value at a dynamic TableView?在动态 TableView 中编辑单元格值?
【发布时间】:2025-12-11 09:10:02
【问题描述】:

是否可以在动态 TableView(动态行和动态列)中编辑单元格值?

我在互联网上找到的只是单元格上的一些可编辑的文本字段。
但是,我想编辑表中的值,然后用新数据更新我的列表。

我正在使用 IntelliJ IDEA 13.1.4 、JavaFX Scene Builder 2.0 和最新的 JavaFX 版本。

这是我创建动态行和列的代码:

public List<String[]> jdata = new LinkedList<>(); //Here is the data
private TableView<String[]> sourceTable;
private ObservableList<String[]> srcData;
.
.
.

int clms;
    
    public void showTable(Convert cnv) {
        clms = cnv.getColums(); //number of the columns

        for (int i = 0; i < clms; i++) {
            TableColumn<String[], String> firstNameCol = new TableColumn<>("\tC"+(i+1)+" \t");
            firstNameCol.setMinWidth(20);
            int index = i ;
            firstNameCol.setCellValueFactory(cellData -> {
                String[] rowData = cellData.getValue();
                if (index >= rowData.length) {
                    return new ReadOnlyStringWrapper("");
                } else {
                    String cellValue = rowData[index];
                    return new ReadOnlyStringWrapper(cellValue);
                }
            });
            sourceTable.getColumns().add(firstNameCol);
        }
        srcData = FXCollections.observableList(jdata);
        sourceTable.getItems().addAll(srcData);
    }

【问题讨论】:

    标签: java javafx tableview edit


    【解决方案1】:

    此代码将使firstNameCol 列可编辑。当您单击此列下的任何单元格时,您将获得一个 TextField,您可以在其中输入值。当您按 Enter 时,该值将保存在表格中。

    更新: 假设您已经为您的 Table 创建了一个模型类,并假设它的名称是 TestCasesModel,这就是上面代码的样子。

    firstNameCol.setCellFactory(TextFieldTableCell.<TestCasesModel>forTableColumn());
            firstNameCol.setOnEditCommit(
                    new EventHandler<CellEditEvent<TestCasesModel, String>>() {
                        @Override
                        public void handle(CellEditEvent<TestCasesModel, String> t) {
                            ((TestCasesModel) t.getTableView().getItems().get(
                                    t.getTablePosition().getRow())
                                    ).setObjectName(t.getNewValue());
                        }
                    }
                    );
    

    使用 POJO 类而不是字符串数组始终是一个好习惯。 CellEditEvent 必须像这样导入:

    import javafx.scene.control.TableColumn.CellEditEvent;
    

    【讨论】:

    • 我应该在每个 中添加什么?因为 IntelliJ 说:“需要标识符”
    • 尝试创建一个模型类(POJO类)对应你表中的每一列。在 之间使用该模型类
    • 这应该是一个动态的tableview,所以我不知道我有多少列。这就是为什么我不能创建模型类...
    • 什么是cnv.getColumns()?你不能不确定你得到的列。至少你必须拥有一组你可能得到的所有可能的列。您需要将所有这些都包含在 POJO 类中,并仅填充动态生成的那些。
    • cnv.getColumns() 为您提供列数(如果它们是 6 列,则返回 (int) 6)....但我不明白您对 POJO 类等的含义.. .-.
    【解决方案2】:

    做吧

    firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
    firstNameCol.setOnEditCommit(event -> {
        String[] row = event.getRowValue();
        row[index] = event.getNewValue();
    });
    

    【讨论】:

    • 只有最后一列是可编辑的,不是所有创建的列。