我一直在努力解决这个问题,似乎找不到任何逻辑解决方案。
我试图在用户单击时保存表单元格的内容。跟随this tutorial之后,我有了表格单元格,这些表格单元格在焦点丢失时(用户单击同一列时除外)保存其编辑。
我知道为什么会发生此问题,如果commitEdit()
为true,则isEditing()
方法将立即返回(当您单击同一列时即是如此)。
public void commitEdit(T newValue) {
if (! isEditing()) return;
...
我试图重写该方法无济于事。我可以强制更新单元格内容,但是我不知道如何在不知道我所在单元格的情况下强制编辑单元格值。
如果我有办法获取所在单元格的字段名称,则可以使用Reflection强制进行更新,但是我不知道如何获取字段名称,或者甚至不知道如何获取。
最佳答案
似乎您正在寻找的是单元处理新(或旧)值并将其写回到模型的一种方法。为什么不只提供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));