TreeTableView (または TableView) がフォーカスを失ったときに値をコミットしようとする簡単な方法はありますか?
残念ながら、私は javafx TableCellFactories のデフォルト実装で成功しませんでした。そのため、独自の TreeTableCell 実装と、Graham Smithのもののようないくつかの異なる tableCell 実装を試しました。これは、既にフックを実装しているため、最も簡単に思えました。フォーカスが失われますが、値はコミットされず、ユーザーの変更は元の値にリセットされます。
私の推測では、フォーカスが失われるたびに、影響を受けるセルの editProperty は常に既に false であるため、セルが 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 などのキーでコミットすると、値が 2 回コミットされます (キー + フォーカスが失われた場合)。さらに、私は自分のアプローチがまったく好きではないので、他の誰かがこれを「より良い」方法で解決したのではないかと思いますか?