Есть ли какой-либо простой подход, позволяющий TreeTableView (или TableView) пытаться зафиксировать значения потерянного фокуса?
К сожалению, я не преуспел в каких-либо реализациях javafx TableCellFactories по умолчанию, поэтому я попробовал свои собственные реализации TreeTableCell, а также некоторые другие реализации tableCell, такие как: Graham Smith, который казался наиболее прямым, так как он уже реализовал крючок для фокуса, но тем не менее значение никогда не выполняется, а пользовательские настройки возвращаются к исходному значению.
Моя догадка заключается в том, что всякий раз, когда фокус теряется, свойство editProperty затронутой ячейки всегда является ложным, что заставляет 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, для фиксации значения дважды (по клавише + при утере фокуса). Кроме того, мне совсем не нравится мой подход, поэтому я задаюсь вопросом, может ли кто-нибудь еще решить это "лучше"?