Вызов подпрограммы при нажатии вверх или вниз в 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 ответа

Вам придется разделить шаги:

  1. Сначала поставить два 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);
    
  2. Тогда свяжите это 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;
            }

        }
    }
}
Другие вопросы по тегам