JavaFX TableView 更新单元格,不更新对象值

JavaFX TableView update cell, does not update the object value

在使列可编辑为文本字段并能够编辑和更新单元格内显示的值后,我注意到每当我尝试从 tableview 中提取更新的值时,只有旧的原始未编辑值返回给我 - 单元格内表示的值似乎不等于从基础模型对象返回的值。

为了使我的列可编辑,我使用以下代码:

ObservableList<TableColumn> colums = search.getColumns();

colums.get(1).setEditable(true);
colums.get(1).setCellFactory(TextFieldTableCell.<DataPoint>forTableColumn());
colums.get(1).setCellValueFactory(new PropertyValueFactory<DataPoint, String>("No"));

DataPoint 对象的一小段如下所示

public class DataPoint {
    private ArrayList<String> data;

    /* Constructor not shown in example */

    // Get Number
    public String getNo() {
        return this.data.get(1);
    }

    public void setNo(String No) {
        this.data.set(1, No);
    }
}

要提取单元格的值,使用以下代码:

DataPoint selectedData = (DataPoint) TableView_Search.getSelectionModel().getSelectedItem();

System.out.println(selectedData.getNo());

那么我如何将更新后的值保存在模型对象中/我如何提取单元格中的 shown 值?

(我的 GUI 是使用 Gluon 的 Scene Builder 程序制作的 FXML 文档)

除非 cellValueFactory returns 一个 属性 也允许您写入项目,否则您需要使用 onEditCommit 事件将值存储在物品。 PropertyValueFactory returns 不写入项目的 属性,如果只有 getter 和 setter 但没有 属性 getter存在于项目 class.

((TableColumn<DataPoint, String>) colums.get(1)).setOnEditCommit(evt -> evt.getRowValue().setNo(evt.getNewValue()));

或者,您可以使用从 cellValueFactory 返回的 JavaBeanStringProperty 来实现此效果:

JavaBeanStringPropertyBuilder builder = JavaBeanStringPropertyBuilder.create().beanClass(DataPoint.class).name("no");
colums.get(1).setCellValueFactory(cd -> builder.bean(cd.getValue()).build());