0

Java でコマンド ライン アプリケーションを作成しています。を使用するのではなくSystem.console()、JFrame 内で実行されるカスタム コンソールを作成しています。これは主に、Eclipse のような IDE 内からSystem.console()戻るという事実を回避するためです。null

コンソールには非常に基本的な機能のみが必要です。

  • Backspace キーと Delete キーを使用して、キャレットの前後の文字を削除する必要があります
  • 上下のキーは、以前に入力したコマンドを循環する必要があります。

KeyEventListener を使用し、switch ステートメントを使用して特殊キー (Backspace、Delete、Up、Down、Left、Right など) の適切なアクションを選択し、それ以外の場合は、押されたキーをコンソールに出力することで、これを実現しました。

Delete キーが押された場合を除いて、すべてが機能します。switch ステートメント内の Delete ステートメントと Up ステートメントの両方が実行されます。これは、Delete キーを押すと、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 を使用するつもりであり、これで問題が解決することを期待しています。しかし、私はまだこれを引き起こす原因を知りたいと思っています。

編集: コードに誤りがありました。それは今動作します。

4

1 に答える 1

1

break前の行をスキップしましたcase KeyEvent.VK_UP:

于 2013-06-26T10:51:27.473 に答える