3

enter此代码在按下JTable(称为gametable)时调用例程。它工作得很好,但我希望在不需要按下的情况下Action向上或向下移动时调用它;我无法让它工作。我尝试用 替换,但我无法在桌子上上下移动?JTableenterVK_ENTERVK_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);

我想不通。有人能帮我吗?

4

2 回答 2

3

您必须将这些步骤分开:

  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)在这种情况下的使用持谨慎态度;您应该在事件调度线程上构建您的 GUI 。

于 2012-08-11T18:37:36.943 回答
0

您需要在 JTable 中添加一个 keylistener。然后在您的按键监听器中,您可以检查任何按下的按钮,包括 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;
            }

        }
    }
}
于 2012-08-11T18:36:54.513 回答