Прошу прощения, если раньше был дан ответ, я попытался найти решение, но я не смог найти ничего подходящего. Я новичок в этом, поэтому есть шанс, что я полностью упустил или проигнорировал что-то, что привело бы меня к простому решению.Swing JTable - Использование привязки клавиш вместо KeyListener по клавише Shift
Я реализовал прослушиватель клавиш для клавиши shift, так что, когда пользователь нажимает shift, он вводит ячейку ровно в одну строку перед редактированием (см. Код ниже). Хотя есть одна проблема; Если пользователь в данный момент вводит данные в ячейку, клавиша сдвига не работает, и при отладке мы видим, что программа никогда не входит в прослушиватель клавиш. Мне было сказано использовать ключевое связывание вместо ключевых слушателей, чтобы исправить эту проблему. Я попытался выполнить некоторые обучающие онлайн, и похоже, что я потерпел неудачу. Любая помощь будет очень признательна, спасибо много!
Два ключевых слушателей (вкладка работает отлично, а сдвиг не делает):
table.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
//KeyCode 9 is a key code for the Tab key
if (e.getKeyCode() == 9) {
if(table.isCellEditable(table.getSelectedRow(),table.getSelectedColumn())) {
table.editCellAt(table.getSelectedRow(), table.getSelectedColumn());
} else {
table.editCellAt(table.getSelectedRow(), table.getSelectedColumn() + 1);
}
}
//The problem occurs here
//KeyCode 16 is a key code for the Shift key
if (e.getKeyCode() == 16) {
if(table.isCellEditable(table.getSelectedRow() + 1, table.getSelectedColumn())) {
table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn());
table.setColumnSelectionInterval(table.getSelectedColumn(), table.getSelectedColumn());
table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1);
} else {
table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn() + 1);
table.setColumnSelectionInterval(table.getSelectedColumn() + 1, table.getSelectedColumn() + 1);
table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1);
}
}
}
});
Вот моя попытка (и не удалось) решение:
class ShiftAction extends AbstractAction{
public void actionPerformed(ActionEvent ae){
System.out.println("Shift");
table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn());
table.setColumnSelectionInterval(table.getSelectedColumn(), table.getSelectedColumn());
table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1);
}
}
shiftAction = new ShiftAction();
table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT,KeyEvent.SHIFT_DOWN_MASK),"doShiftAction");
table.getActionMap().put("doShiftAction",shiftAction);
Надеюсь, вопрос не слишком глуп, и когда-то снова, спасибо заранее.
«Мне было сказано использовать привязку клавиш вместо ключевых слушателей, чтобы исправить эту проблему».: Who who ?? попросите их. это не исправит вашу проблему, но увеличит ваши проблемы (как вы правильно видите сейчас) – gpasch
Мне сказал это мой преподаватель Java, у которого не так много времени, чтобы помочь мне (у меня осталось еще несколько дней до Я должен закончить проект). Это не такая уж большая сделка, я могу оставить ее как есть, это больше для меня опыт обучения. –
@gpasch, да, Key Bindings - лучшее решение. Это новейший и лучший API и решает проблему фокуса. – camickr