使用Java中JTextArea实现类似命令行操作的界面

直接上代码和运行截图咯,后面自己想利用这个实现类似于ssh的命令行工具,远程连接和执行linux命令。

目前的实现还有个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("\n");
			if (input.equals("exit")) {
				this.append("Bye.");
				System.exit(0);
			} else {
				this.append(input);
				this.append("\n");
				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;
	}
}


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值