У меня есть прослушиватель событий, который прослушивает события клавиатуры. Когда я пытаюсь войти в режим редактирования с помощью ключевого события, по какой-то странной причине в режим редактирования входит неправильная ячейка.
Например, я хочу изменить ячейку. Я использую стрелки клавиатуры, чтобы перейти к ячейке, которую я хочу отредактировать, то есть к ячейке, которая находится в фокусе. Щелкнув букву на клавиатуре, выделенная ячейка должна войти в режим редактирования. Когда я пытаюсь изменить выделенную ячейку, неправильная ячейка переходит в режим редактирования.
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
? - person James_D   schedule 11.02.2015table.setOnKeyPressed(...)
.onKeyPressed
— это свойство, поэтому каждое из них переопределяет предыдущий вызов. Следовательно, обработчикonPressed
для таблицы вызоветhandleKeyPressed(...)
для последней созданной ячейки (которая, очевидно, не обязательно является сфокусированной). - person James_D   schedule 11.02.2015