У меня есть прослушиватель событий, который прослушивает события клавиатуры. Когда я пытаюсь войти в режим редактирования, используя ключевое событие, по какой-то странной причине неправильная ячейка переходит в режим редактирования.TableView - редактирование сфокусированной ячейки
Например, я хочу отредактировать ячейку. Я использую стрелки клавиатуры, чтобы перейти к ячейке, которую я хочу редактировать, т. Е. Ячейке, которая сфокусирована. Нажимая букву на клавиатуре, сфокусированная ячейка должна перейти в режим редактирования. Когда я пытаюсь отредактировать сфокусированную ячейку, неправильная ячейка переходит в режим редактирования.
private final class EditCell extends TableCell<SimpleStringProperty, String> implements GenericTable
{
public EditCell()
{
// Add event listsner. table is a TableView
table.setOnKeyPressed(keyEvent -> this.handleKeyPressed(keyEvent));
}
public void handleKeyPressed(KeyEvent key)
{
// Keyboard events
if (key.getCode().isLetterKey())
{
if (!this.isEditing())
{
this.edit = true;
// focus index
int focusIndex = this.table.getSelectionModel().getFocusedIndex();
this.changeTableCellFocus(this.table, focusIndex);
this.startEdit();
}
}
}
// startEdit() function
@Override
public void startEdit()
{
if (this.edit)
{
LOGGER.info("Start editing on cell index: " + this.getIndex());
super.startEdit();
this.createTextField();
this.setText(null);
this.setGraphic(this.textField);
this.textField.selectAll();
this.textField.requestFocus();
this.textField.setOnKeyPressed(keyEvent -> this.handleKeyPressed(keyEvent));
this.textField.focusedProperty()
.addListener((observable, oldValue, newValue) -> this.onTextFieldFocusChange(observable,
oldValue,
newValue));
}
}
// Change focus
public void changeTableCellFocus(final TableView<?> table, final int focusIndex)
{
table.requestFocus();
table.getSelectionModel().clearAndSelect(focusIndex);
table.getFocusModel().focus(focusIndex);
}
}
Перед тем, как войти в режим редактирования, я сменю фокус на щелканную ячейку и вызову метод startEdit(). Я попытался отладить проблему, но не повезло. Я заметил, что focusIndex отличается от текущего индекса ячейки. Я не уверен, почему индекс отличается.
Можете ли вы привести этот код в какой-то контекст? Это в подклассе 'TableCell'? –
Вы пытались использовать выбор вместо фокуса? Я думаю, что редактирование таблицы основано на выборе не на фокусе. – eckig
Функция changeTableCellFocus (...) выбирает ячейку + помещает фокус на ячейку. Вы имеете в виду, просто выберите ячейку, а затем вызовите startEdit(). Я думаю, проблема заключается в том, что текущий индекс ячейки отличается от индекса ячейки фокуса, а это означает, что даже если вы измените выбранную ячейку на сфокусированную ячейку индекса, у вас все еще будет проблема, так как в текущей ячейке вызывается функция startEdit(). – breaktop