我一直在为这个问题绞尽脑汁,似乎找不到任何逻辑解决方案。
当用户单击离开时,我尝试保存表格单元格的内容。关注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/