首页 > 解决方案 > 如果字段输入为空,则 TableColumn 停止 EditCommit

问题描述

我有这个TableColumn<Foo, String> colValue = new TableColumn<>("Value");

使用此设置:

colValue.setCellValueFactory(new PropertyValueFactory<>("value"));
colValue.setCellFactory(TextFieldTableCell.forTableColumn());
colValue.setOnEditCommit(event -> {

    //get new value
    String newValue = event.getNewValue().trim();

    //if is empty not update
    if(newValue.isEmpty()){ return; }

    //set new value
    event.getRowValue().setValue(newValue);

    //refresh table
    tableView.refresh();

});

我想要的是直接从表中更新对象字段。双击单元格时,更改值并提交。
但是当字段输入为空白时,我不想更新值。

上面的代码工作正常。仅当值不为空时才更新对象。

但问题是,如果字段输入为黑色,并且已提交,则对象不会更新,但单元格是空白的。

即使对于单元格,如何防止提交?如果提交时字段输入为空白,我想在单元格中查看旧值(对象的实际值)。

标签: javajavafx

解决方案


似乎在触发事件时,拦截更新单元格的文本为时已晚。

这有点小技巧(可能更好的方法是TableCell直接子类化并实现行为以在用户按 Enter 等时直接调用cancelEdit,使用空字符串)。commitEdit(...)但是,您可以按如下方式覆盖该方法:

colValue.setCellValueFactory(new PropertyValueFactory<>("value"));
//colValue.setCellFactory(TextFieldTableCell.forTableColumn());
//colValue.setOnEditCommit(event -> {
//
//    //get new value
//    String newValue = event.getNewValue().trim();
//
//    //if is empty not update
//    if(newValue.isEmpty()){ return; }
//
//    //set new value
//    event.getRowValue().setValue(newValue);
//
//    //refresh table
//    tableView.refresh();
//
//});

colValue.setCellFactory(tc -> new TextFieldTableCell<>(TextFormatter.IDENTITY_STRING_CONVERTER) {
    @Override
    public void commitEdit(String newValue) {
        if (newValue.isEmpty()) {
            cancelEdit();
        } else {
            super.commitEdit(newValue);
        }
    }
});

推荐阅读