我正在用Java编写命令行应用程序。我正在编写一个将在JFrame中运行的自定义控制台,而不是使用System.console()
。这主要是为了避免System.console()
从像Eclipse这样的IDE中返回null
这一事实。
我只需要控制台具有非常基本的功能:
我通过使用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,我希望这可以解决问题。但是,我仍然想知道可能导致这种情况的原因。
编辑:代码中有错误。它现在有效。
答案 0 :(得分:1)
您在第break
行
case KeyEvent.VK_UP: