我正在用 Java 编写一个命令行应用程序。System.console()
我正在编写一个自定义控制台,而不是使用,它将在 JFrame 中运行。这主要是为了规避从 Eclipse 之类的 IDE中System.console()
返回的事实。null
我只要求控制台具有非常基本的功能:
- Backspace 和 Delete 键必须删除 Caret 后面或前面的字符
- Up 和 Down 键必须循环通过以前键入的命令。
我通过使用 KeyEventListener 并使用 switch 语句为特殊键(Backspace、Delete、Up、Down、Left、Right 等)选择适当的操作并以其他方式将按下的键打印到控制台来实现这一点。
一切正常,除了按下 Delete 键时,switch 语句中的 Delete 和 Up 语句都被执行。这意味着按下删除键会触发一个 Delete 事件,然后分别触发一个 Up 事件。按下 Delete 键时,插入符号前面的字符被删除,然后显示之前输入的命令。
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,我希望这将解决问题。但是,我仍然想知道可能导致这种情况的原因。
编辑:代码中有错误。现在可以了。