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

时间:2017-01-21 18:07:48

标签: java swing jtable keylistener key-bindings

我很抱歉,如果之前已经回答过,我试图找到解决方案,但我找不到任何相关内容。我是新手,所以我有可能完全忽视或忽略了一些可以让我找到一个简单解决方案的东西。

我已经为shift键实现了一个键监听器,这样当用户按下shift时,他会在进入编辑之前完全进入单元格一行(请看下面的代码)。虽然,但有一个问题;如果用户当前正在向单元格输入数据,则shift键不起作用,并且在调试时,我们可以看到程序从未进入键监听器。我被告知使用键绑定而不是键侦听器来解决这个问题。我试图在线跟踪一些教程,看起来我失败了。非常感谢任何帮助,非常感谢!

两个关键的监听器(Tab工作正常,而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);

希望这个问题不是太愚蠢,而且要再次提前感谢。

1 个答案:

答案 0 :(得分:1)

e.getKeyCode() == 9

首先,不要使用魔术数字。阅读代码的人不知道“9”的含义。使用KeyEvent API中提供的字段:KeyEvent.VK_???

  

我们可以看到该程序甚至从未进入关键监听器。

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

  

我被告知使用键绑定而不是键侦听器来解决这个问题。

您需要使用相应的InputMap。在这种情况下,它应该是:

JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT

阅读How to Use Key Bindings上的Swing教程中的部分以获取更多信息。