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

时间:2018-04-25 17:48:14

标签: java javafx tableview fxml

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

要使我的列可编辑,请使用以下代码:

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());

那么如何在模型对象中保存此更新值/如何在单元格中提取显示的值?

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

1 个答案:

答案 0 :(得分:0)

除非cellValueFactory返回一个也允许您写入项目的属性,否则您需要使用onEditCommit事件将值存储在项目中。 PropertyValueFactory返回一个不写入该项的属性,如果只是getter和setter但是item类中不存在属性getter。

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

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

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