KeyEventListener在Java中同时识别UP和Delete键

时间:2013-06-26 10:48:10

标签: java swing key-events

我正在用Java编写命令行应用程序。我正在编写一个将在JFrame中运行的自定义控制台,而不是使用System.console()。这主要是为了避免System.console()从像Eclipse这样的IDE中返回null这一事实。

我只需要控制台具有非常基本的功能:

  • 退格键和删除键必须删除Caret背后或前面的字符
  • 向上和向下键必须循环显示以前键入的命令。

我通过使用KeyEventListener并使用switch语句为特殊键选择适当的操作(Backspace,Delete,Up,Down,Left,Right等),然后将按下的键打印到控制台。

一切正常,除非按下Delete键,否则将执行switch语句中的Delete和Up语句。这意味着按下删除键会分别触发Delete事件和Up事件。按Delete键时,删除Caret前面的字符,然后显示先前输入的命令。

public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()){
            case KeyEvent.VK_ENTER: 
                String line = getLine();
                previousCommands.add(line.substring(1));
                output.append("\n" + line);
                commandPosition = 0;
                setFinished(true);
                break;

            case KeyEvent.VK_BACK_SPACE:
                if(input.getCaretPosition() <= 1){
                    break;
                }
                int caretPosition = input.getCaretPosition();
                String text = input.getText().
                        substring(0, input.getCaretPosition() - 1) +
                        input.getText().
                        substring(input.getCaretPosition());
                input.setText(text);
                input.setCaretPosition(caretPosition -1);
                break;

            case KeyEvent.VK_DELETE:
                if(input.getCaretPosition() == input.getText().length()){
                    break;
                }
                int otherCaretPosition = input.getCaretPosition();
                String otherText = input.getText().
                        substring(0, otherCaretPosition) +
                        input.getText().
                        substring(otherCaretPosition + 1);
                input.setText(otherText);
                input.setCaretPosition(otherCaretPosition);
                            break;

            case KeyEvent.VK_UP:
                if(previousCommand() != null){
                    setLine(">" + previousCommand());
                }
                break;

            case KeyEvent.VK_DOWN:
                if(nextCommand() != null){
                    setLine(">" + nextCommand());
                }
                break;

            case KeyEvent.VK_LEFT:
                if(input.getCaretPosition() <= 1){
                    input.setCaretPosition(1);
                    break;
                }
                input.setCaretPosition(input.getCaretPosition() - 1);
                break;

            case KeyEvent.VK_RIGHT:
                if(input.getCaretPosition() == input.getText().length()){
                    input.setCaretPosition(input.getText().length());
                    break;
                }
                input.setCaretPosition(input.getCaretPosition() + 1);
                break;

            default:
                break;
        }

    }

我省略了课程的其余部分,因为我认为没有必要。我打算离开KeyEventListener并改为使用KeyBindings,我希望这可以解决问题。但是,我仍然想知道可能导致这种情况的原因。

编辑:代码中有错误。它现在有效。

1 个答案:

答案 0 :(得分:1)

您在第break

之前跳过case KeyEvent.VK_UP: