是否有任何简单的方法可以让 TreeTableView(或 TableView)尝试在失去焦点时提交值?
不幸的是,我没有成功使用 javafx TableCellFactories 的任何默认实现,这就是为什么我尝试了自己的 TreeTableCell 实现以及一些不同的 tableCell 实现,比如Graham Smith的那个,这似乎是最直接的,因为它已经实现了一个钩子因为焦点丢失,但该值从未提交,并且用户更改被重置为原始值。
我的猜测是,每当失去焦点时,受影响的 Cell 的 editingProperty 总是已经是 false,这导致 Cell 永远不会在 focusLost 上提交值。这里是原始(oracle-)TreeTableCell 实现(8u20ea)的相关部分,这导致我的方法失败:
@Override public void commitEdit(T newValue) {
if (! isEditing()) return; // <-- here my approaches are blocked, because on focus lost its not editing anymore.
final TreeTableView<S> table = getTreeTableView();
if (table != null) {
@SuppressWarnings("unchecked")
TreeTablePosition<S,T> editingCell = (TreeTablePosition<S,T>) table.getEditingCell();
// Inform the TableView of the edit being ready to be committed.
CellEditEvent<S,T> editEvent = new CellEditEvent<S,T>(
table,
editingCell,
TreeTableColumn.<S,T>editCommitEvent(),
newValue
);
Event.fireEvent(getTableColumn(), editEvent);
}
// inform parent classes of the commit, so that they can switch us
// out of the editing state.
// This MUST come before the updateItem call below, otherwise it will
// call cancelEdit(), resulting in both commit and cancel events being
// fired (as identified in RT-29650)
super.commitEdit(newValue);
// update the item within this cell, so that it represents the new value
updateItem(newValue, false);
if (table != null) {
// reset the editing cell on the TableView
table.edit(-1, null);
// request focus back onto the table, only if the current focus
// owner has the table as a parent (otherwise the user might have
// clicked out of the table entirely and given focus to something else.
// It would be rude of us to request it back again.
ControlUtils.requestFocusOnControlOnlyIfCurrentFocusOwnerIsChild(table);
}
}
在调用原始 commitEdit() 方法之前,我成功地覆盖了此方法并“手动”提交了值,但这会导致像 enter 这样的键提交两次提交值(在键 + 焦点丢失时)。此外,我根本不喜欢我的方法,所以我想知道,是否有其他人以“更好”的方式解决了这个问题?