Вызов подпрограммы при нажатии вверх или вниз в JTable
Этот код вызывает процедуру, когда ввод JTable
(называется gametable
). Работает хорошо, но хотелось бы того же Action
вызываться при движении вверх или вниз в JTable
без необходимости нажатия вводить; Я не могу заставить его работать. Я пытался заменить VK_ENTER
с VK_UP
, но я не могу двигаться вверх и вниз по столу?
KeyStroke enter = KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER, 0);
gameTable.getJTable().unregisterKeyboardAction(enter);
gameTable.getJTable().registerKeyboardAction(new ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
synchronized (this) {
gotoGame(gameTable.getSelectedIndex());
}
}
}, enter, JComponent.WHEN_FOCUSED);
Я не могу понять это. Кто-нибудь может мне помочь?
2 ответа
Вам придется разделить шаги:
Сначала поставить два
KeyStroke
случаи вInputMap
поэтому они нацелены на то же самоеactionMapKey
:KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); KeyStroke up = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); String actionMapKey = "anActionMapKey"; gameTable.getInputMap().put(enter, actionMapKey); gameTable.getInputMap().put(up, actionMapKey);
Тогда свяжите это
actionMapKey
с вашимAction
:gameTable.getActionMap().put(actionMapKey, new AbstractAction(actionMapKey) { ... });
Посмотрите, Как Использовать Действия и Связывания клавиш для деталей.
Я опасаюсь вашего использования synchronized (this)
в данном контексте; вы должны создавать свой графический интерфейс в потоке отправки событий.
Вам нужно добавить список ключей в ваш JTable. Затем в вашем ключевом слушателе вы можете проверить любую нажатую кнопку, включая Enter, и выполнить то же действие.
У меня есть программа с похожим кодом. Здесь я просто отображаю разные значения в одной текстовой области, если клавиша со стрелкой выбирает другую ячейку, но я думаю, что это может дать вам представление о том, как ее настроить.
import java.awt.event.KeyEvent;
import javax.swing.JTable;
public class MyClass {
static JTable table = new JTable();
public static void main(String[] args) {
table.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(final java.awt.event.KeyEvent evt) {
tableKeyReleased(evt);
}
});
}
private static void tableKeyReleased(final java.awt.event.KeyEvent evt) {
final int key = evt.getKeyCode();
if (key == KeyEvent.VK_UP || key == KeyEvent.VK_DOWN
|| key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT) {
final int row = table.getSelectedRow();
final int column = table.getSelectedColumn();
final Object cellValue = table.getValueAt(row, column);
if (cellValue == null) {
return;
}
}
}
}