JavaFx TableView - 如果焦点被赋予同一列,则保存焦点丢失的编辑不起作用

标签 java javafx tableview

我一直在为这个问题绞尽脑汁,似乎找不到任何逻辑解决方案。

当用户单击离开时,我尝试保存表格单元格的内容。关注this tutorial后我的表格单元格会在焦点丢失时保存编辑内容,除非用户单击同一列。

我知道问题发生的原因,如果 isEditing() 为 true(当您单击同一列时,commitEdit() 方法将立即返回) .

 public void commitEdit(T newValue) {
        if (! isEditing()) return;
    ...

我尝试重写该方法但无济于事。我可以强制更新单元格内容,但我不知道如何在不知道我所在单元格的情况下强制编辑单元格值。

如果有办法让我获取所在单元格的字段名称,我可以使用反射来强制更新,但我不知道如何获取字段名称,或者是否可能。

最佳答案

您似乎正在寻找一种让单元处理新(或旧)值并将其写回模型的方法。为什么不直接以 BiConsumer<S,T> 的形式提供回调? ?

public class EditingCell<S,T> extends TableCell<S,T> {

    private final BiConsumer<S,T> updater ;

    public EditingCell(BiConsumer<S,T> updater) {
        this.updater = updater ;
    }

    // ....

    // not really sure what this method is for:
    public void commit(T val) {
        S rowValue = getTableView().getItems().get(getIndex());
        updater.accept(rowValue, val);
    }

    // wouldn't this be better?
    @Override
    public void commitEdit(T newValue) {
        super.commitEdit(newValue);
        S rowValue = getTableView().getItems().get(getIndex());
        updater.accept(rowValue, val);
    }

    // ...
}

然后你会做这样的事情:

TableView<Person> table = new TableView<>();

TableColumn<Person, String> firstNameColumn = new TableColumn<>("First Name");
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
firstNameColumn.setCellFactory(col -> new EditingCell(Person::setFirstName));

关于JavaFx TableView - 如果焦点被赋予同一列,则保存焦点丢失的编辑不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37660783/

相关文章:

java - 如何以编程方式更改列表项背景颜色?

JAVAFX 如何使堆叠在标签后面的按钮可点击

JavaFX 将 TextField 的 TextFormatter 中的 valueProperty 绑定(bind)到 SimpleDoubleProperty

java - JavaFX tableView 中的导航

java - 使一个类成为 Mockito 模拟而不调用模拟

java - 当我尝试连接到 Spring MVC 时,axios 中出现错误 400

iphone - EGORefreshTableHeaderView 在 iOS 5.1 上无法正常工作

ios - 更新 imageView swift 4 的高度约束时无法同时满足约束

java - Firebase Android : Getting data stored in user Id then to the random Push(). getKey() 值

java: 是否可以为 Buttons 数组设置一个 lambda 表达式是一个 for 循环?如果是这样怎么办?