자바 에서 JTextArea 를 사용 하여 유사 한 명령 행 동작 을 수행 하 는 인터페이스

코드 를 직접 올 리 고 캡 처 를 실행 합 니 다. 나중에 ssh 와 유사 한 명령 행 도 구 를 이용 하여 원 격 연결 과 Liux 명령 을 실행 하고 싶 습 니 다.
현재 의 실현 은 아직 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; } }

좋은 웹페이지 즐겨찾기