Java Swing JTable-在Shift键上使用键绑定而不是KeyListener

Java Swing JTable-在Shift键上使用键绑定而不是KeyListener,java,swing,jtable,keylistener,key-bindings,Java,Swing,Jtable,Keylistener,Key Bindings,很抱歉,如果之前已经回答了这个问题,我试图寻找解决方案,但找不到任何相关的解决方案。我是新来的,所以有一个机会,我完全忽略了或忽略了一些东西,这会导致我找到一个简单的解决方案 我已经为shift键实现了一个键侦听器,因此当用户按下shift键时,他会在进入编辑窗口前恰好一行输入单元格。请查看下面的代码。虽然,有一个问题;如果用户当前正在单元格中输入数据,则shift键不起作用,并且在调试时,我们可以看到程序甚至从未进入按键侦听器。我被告知使用密钥绑定而不是密钥侦听器来解决此问题。我试着在网上学习

很抱歉,如果之前已经回答了这个问题,我试图寻找解决方案,但找不到任何相关的解决方案。我是新来的,所以有一个机会,我完全忽略了或忽略了一些东西,这会导致我找到一个简单的解决方案


我已经为shift键实现了一个键侦听器,因此当用户按下shift键时,他会在进入编辑窗口前恰好一行输入单元格。请查看下面的代码。虽然,有一个问题;如果用户当前正在单元格中输入数据,则shift键不起作用,并且在调试时,我们可以看到程序甚至从未进入按键侦听器。我被告知使用密钥绑定而不是密钥侦听器来解决此问题。我试着在网上学习一些教程,但似乎失败了。任何帮助都将不胜感激,非常感谢

“双键侦听器”选项卡可以正常工作,而Shift不能:

table.addKeyListener(new KeyAdapter() {
        @Override
        public void keyReleased(KeyEvent e) {
            //KeyCode 9 is a key code for the Tab key
            if (e.getKeyCode() == 9) {
                if(table.isCellEditable(table.getSelectedRow(),table.getSelectedColumn())) {
                    table.editCellAt(table.getSelectedRow(), table.getSelectedColumn());
                } else {
                    table.editCellAt(table.getSelectedRow(), table.getSelectedColumn() + 1);
                }
            }
            //The problem occurs here
            //KeyCode 16 is a key code for the Shift key
            if (e.getKeyCode() == 16) {
                if(table.isCellEditable(table.getSelectedRow() + 1, table.getSelectedColumn())) {
                    table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn());
                    table.setColumnSelectionInterval(table.getSelectedColumn(), table.getSelectedColumn());
                    table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1);
                } else {
                    table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn() + 1);
                    table.setColumnSelectionInterval(table.getSelectedColumn() + 1, table.getSelectedColumn() + 1);
                    table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1);
                }

            }
        }
    });
以下是我尝试过但失败的解决方案:

 class ShiftAction extends AbstractAction{
        public void actionPerformed(ActionEvent ae){
            System.out.println("Shift");
            table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn());
            table.setColumnSelectionInterval(table.getSelectedColumn(), table.getSelectedColumn());
            table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1);
        }
    }
    shiftAction = new ShiftAction();
    table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT,KeyEvent.SHIFT_DOWN_MASK),"doShiftAction");
    table.getActionMap().put("doShiftAction",shiftAction);
希望这个问题不是太愚蠢,再一次,提前谢谢你

e.getKeyCode() == 9
首先,不要使用幻数。阅读代码的人不知道9是什么意思。使用KeyEventAPI中提供的字段:KeyEvent.VK_

我们可以看到,该程序甚至从未进入密钥侦听器

焦点是用作单元格编辑器的JTextField,因此它接收KeyEvent,而不是表


我被告知使用密钥绑定而不是密钥侦听器来解决此问题

您需要使用适当的InputMap。在这种情况下,应为:

JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT

有关更多信息,请阅读Swing教程中的部分。

我很抱歉,我希望我已经仔细考虑过了。Tab键的键代码为9,Shift键的键代码为16。我将立即在中编辑信息。我将尝试将所有这些应用于代码。我想知道,在这种情况下,合适的JComponent是JTable还是JTextField?我被告知使用键绑定而不是键侦听器来解决这个问题。:由谁??去问问他们。这不会解决您的问题,但会增加您的问题,正如您现在正确看到的,我的Java讲师已经告诉我这样做,他没有那么多时间来帮助我,我还有几天的时间完成项目。这没什么大不了的,我可以保持原样,这对我来说更像是一次学习经历。@gpasch,是的,键绑定是更好的解决方案。它是一个更新更好的API,解决了焦点问题。