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 を使用するつもりであり、これで問題が解決することを期待しています。しかし、私はまだこれを引き起こす原因を知りたいと思っています。
編集: コードに誤りがありました。それは今動作します。