자바 에서 JTextArea 를 사용 하여 유사 한 명령 행 동작 을 수행 하 는 인터페이스
현재 의 실현 은 아직 bug 가 있 습 니 다. 나중에 해결 해 야 합 니 다. 이 bug 를 발견 할 수 있 습 니까? ㅎ
import java.awt.BorderLayout;
import java.awt.Font;
import javax.swing.JFrame;
public class TextAreaTest {
public static void main(String[] args) {
JFrame frame = new JFrame("CMD Text Area");
frame.setBounds(200, 200, 700, 400);
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CmdTextArea textArea = new CmdTextArea();
textArea.addKeyListener(textArea);
textArea.addCaretListener(textArea);
textArea.setFont(new Font("宋体", Font.PLAIN, 14));
frame.add(textArea, BorderLayout.CENTER);
frame.setVisible(true);
textArea.append("Please input commend<type 'exit' to exit>:");
textArea.requestFocus();
textArea.setCaretPosition(textArea.getText().length());
}
}
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextArea;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
public class CmdTextArea extends JTextArea implements KeyListener,
CaretListener {
private static final long serialVersionUID = 1L;
private StringBuffer textBuffer = new StringBuffer();
private int currentDot = -1;
private boolean isAllowedInputArea = false;
private int currentKeyCode = 0;
private boolean isConsume = false;
public CmdTextArea() {
super();
}
@Override
public void keyTyped(KeyEvent e) {
if (isConsume) {
e.consume();
return;
}
// 以'enter'键结束命令输入
if (currentKeyCode == KeyEvent.VK_ENTER) {
String input = this.getText().substring(textBuffer.length(),
this.getText().length() - 1);
textBuffer.append(input);
textBuffer.append("
");
if (input.equals("exit")) {
this.append("Bye.");
System.exit(0);
} else {
this.append(input);
this.append("
");
this.append("Please input commend<type 'exit' to exit>:");
}
}
}
@Override
public void keyPressed(KeyEvent e) {
currentKeyCode = e.getKeyCode();
isConsume = checkConsume(e) ? true : false;
}
@Override
public void keyReleased(KeyEvent e) {
if (isConsume) {
e.consume();
return;
}
}
/**
* 检查是否要使用输入事件
*
* @param e
* @return
*/
private boolean checkConsume(KeyEvent e) {
if (!isAllowedInputArea) {
e.consume();
return true;
}
if ((currentKeyCode == KeyEvent.VK_BACK_SPACE
|| currentKeyCode == KeyEvent.VK_ENTER
|| currentKeyCode == KeyEvent.VK_UP || currentKeyCode == KeyEvent.VK_LEFT)
&& currentDot == textBuffer.length()) {
e.consume();
return true;
}
return false;
}
@Override
public void append(String message) {
super.append(message);
textBuffer.append(message);
}
@Override
public void caretUpdate(CaretEvent e) {
currentDot = e.getDot();
isAllowedInputArea = currentDot < textBuffer.length() ? false : true;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.