我能够在 jtable 中捕获 TAB,但是如何捕获 SHIFT+TAB?

I am able to capture the TAB in a jtable, but how do I capture the SHIFT+TAB?

我有一个 JTable,我需要更改其中的遍历,以便 TAB 击键逐行前进。 (通常,TAB 击键逐个单元格前进。)我能够更改 TAB 击键的正向遍历。我在 SHIFT+TAB 上尝试了同样的反向遍历。我无法捕获 SHIFT+TAB。

    InputMap im = myTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    ActionMap am = myTable.getActionMap();

    // make shift+tab row to row instead of cell to cell
    Action shiftTabActionmyTable = new AbstractAction("SHIFT+TAB")
    {
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("!!!!!!!!!!!!!!!!!!!!!!inside");
            int rowView = myTable.getSelectedRow();
            int numRows = myTable.getRowCount();

            if (0 < numRows)
            {
                if ((-1 == rowView) || (0 == rowView))
                {
                    // Move to last row
                    rowView = numRows - 1;
                }
                else
                {
                    // Move to prev row
                    rowView--;
                 }

                myTable.changeSelection(rowView, 0, false, false);
                myTable.scrollRectToVisible(myTable.getCellRect(rowView, COL_ICON, true));
            }
        }
    };
    KeyStroke VK_Shift_Tab = KeyStroke.getKeyStroke("SHIFT+TAB");
    im.put(VK_Shift_Tab, shiftTabActionmyTable.getValue(Action.NAME));
    am.put(shiftTabActionmyTable.getValue(Action.NAME), shiftTabActionmyTable);

    System.out.println("!!!!!!!!!!!!!!!!!!!!!!Name " + shiftTabActionmyTable.getValue(Action.NAME));


    // Make tab row to row instead of cell to cell
    Action tabActionmyTable = new AbstractAction("TAB")
    {
        public void actionPerformed(ActionEvent e)
        {
            int rowView = myTable.getSelectedRow();
            int numRows = myTable.getRowCount();

            if (0 < numRows)
            {
                if ((-1 == rowView) || ((numRows - 1) == rowView))
                {
                    // Move to first row
                    rowView = 0;
                }
                else
                {
                    // Move to next row
                    rowView++;
                }

                myTable.changeSelection(rowView, 0, false, false);
                myTable.scrollRectToVisible(myTable.getCellRect(rowView, COL_ICON, true));
            }
         }
    };
    KeyStroke VK_Tab = KeyStroke.getKeyStroke("TAB");
    im.put(VK_Tab, tabActionmyTable.getValue(Action.NAME));
    am.put(tabActionmyTable.getValue(Action.NAME), tabActionmyTable);

如何在 JTable 中捕获 SHIFT+TAB?

使用

KeyStroke VK_Shift_Tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB,
            InputEvent.SHIFT_DOWN_MASK);

或使用

KeyStroke VK_Shift_Tab = KeyStroke.getKeyStroke("shift TAB");

而不是

KeyStroke VK_Shift_Tab = KeyStroke.getKeyStroke("SHIFT+TAB");

它应该可以工作。

KeyStroke.getKeyStroke(String s) 的文档指出

Parses a string and returns a KeyStroke. The string must have the following syntax:

<modifiers>* (<typedID> | <pressedReleasedID>)

modifiers := shift | control | ctrl | meta | alt | altGraph
typedID := typed <typedKey>
typedKey := string of length 1 giving Unicode character.
pressedReleasedID := (pressed | released) key
key := KeyEvent key code name, i.e. the name following "VK_".  

If typed, pressed or released is not specified, pressed is assumed. Here are some examples:

 "INSERT" => getKeyStroke(KeyEvent.VK_INSERT, 0);
 "control DELETE" => getKeyStroke(KeyEvent.VK_DELETE, InputEvent.CTRL_MASK);
 "alt shift X" => getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK);
 "alt shift released X" => getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK, true);
 "typed a" => getKeyStroke('a');