【问题标题】:I am able to capture the TAB in a jtable, but how do I capture the SHIFT+TAB?我可以在 jtable 中捕获 TAB,但是如何捕获 SHIFT+TAB?
【发布时间】:2023-03-24 06:15:02
【问题描述】:

我有一个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?

【问题讨论】:

    标签: java swing key-bindings key-events


    【解决方案1】:

    使用

    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) 状态的文档

    解析一个字符串并返回一个 KeyStroke。该字符串必须具有 以下语法:

    <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_".  
    

    如果未指定键入、按下或释放,则假定已按下。 以下是一些示例:

     "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');
    

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 2011-09-19
      • 2011-08-08
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2021-05-09
      相关资源
      最近更新 更多