JavaFX-在动态TableView上编辑单元格值?

时间:2015-07-14 08:51:29

标签: java intellij-idea javafx tableview edit

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

我在互联网上找到的只是一些可编辑的TextFileds 但我想编辑表格上的值,然后用新数据更新我的列表。

我使用的是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);
    }

1 个答案:

答案 0 :(得分:0)

此代码会使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类而不是String数组始终是一个好习惯。 必须像这样导入CellEditEvent:

import javafx.scene.control.TableColumn.CellEditEvent;