SWING中模拟键盘输入例子

主要是在做触屏的SWING软件时,遇到需要用户输入中文的情况,系统的osk的按钮太多了,而且没有办法定制化,所以就自己写了一个模拟的。以下是代码:


package test.swing;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class KeyboardTest extends JPanel implements ActionListener{
	JTextField text  ;
	Robot robot;
	int[] line1 = {192,49,50,51,52,53,54,55,56,57,48,45,61,8}; // 按键的第一排
	int[] line2 = {81,87,69,82,84,89,85,73,79,80,91,93,92};	// q到\ 没有tab
	int[] line3 = {KeyEvent.VK_CAPS_LOCK,65,83,68,70,71,72,74,75,76,59,222,10}; // 大写到'
	int[] line4 = {16,90,88,67,86,66,78,77,44,46,47,38}; // shift到 向上
	int[] line5 = {17,18,32,18,17,37,40,39};	// ctrl到 >  不包括 fn、window
	Map<Integer, String> uncharMap = new HashMap<Integer, String>(); // 特殊字符
	public KeyboardTest() {
		// 获取当前大小写
		boolean isUpper = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);
		System.out.println("当前是否大写:"+isUpper);
		// 模拟输入
		try {
			robot = new Robot();
		} catch (AWTException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//
		this.setLayout(null);
		int x = 20,y = 20 ,width = 60 , height = 40;
		text = new JTextField(); 
		text.setBounds(x, y, 800, height);
		this.add(text);
		text.grabFocus();
		// 替换特殊字符
		initUnChar();
		// 添加从 33 - 126 的ascii
		int[][] keyint = new int[5][];
		keyint[0] = line1;
		keyint[1] = line2;
		keyint[2] = line3;
		keyint[3] = line4;
		keyint[4] = line5;
		y = y + height + 20;
		
		// load keys
		int startx = 0,cellspace = 5;
		loadKeys(line1,startx,cellspace,x, y, width, height);
		y = y + height + 20;
		// line2
		int[] tmpInt = new int[]{line2[0]}; // tab
		loadKeys(tmpInt,0,cellspace, x, y, width + width /2 , height);
		startx = x + width + width / 2 - cellspace * 2 ;
		tmpInt = new int[line2.length - 1];
		System.arraycopy(line2, 1, tmpInt, 0, tmpInt.length);
		loadKeys(tmpInt,startx ,cellspace, x, y, width, height);
		// line3
		y = y + height + 20;
		tmpInt = new int[]{line3[0]};
		loadKeys(tmpInt,0,cellspace, x, y, width * 2 , height);
		startx = x + width * 2 - cellspace * 2 ;
		tmpInt = new int[line3.length - 1];
		System.arraycopy(line3, 1, tmpInt, 0, tmpInt.length);
		loadKeys(tmpInt,startx,cellspace, x, y, width, height);
		
		// line4
		y = y + height + 20;
		tmpInt = new int[]{line4[0]};
		loadKeys(tmpInt,0,cellspace, x, y, width * 2 + width / 2 , height);
		startx = x + width * 2 + width / 2 - cellspace * 2 ;
		tmpInt = new int[line4.length - 1];
		System.arraycopy(line4, 1, tmpInt, 0, tmpInt.length);
		loadKeys(tmpInt,startx,cellspace, x, y, width, height);
		/**
		for(int i = 0;i < keyint.length;i++){
			for(int j = 0;j < keyint[i].length; j++){
				String showStr = uncharMap.get(keyint[i][j]); // 显示的字符
				if(showStr == null){
					showStr = String.valueOf((char) keyint[i][j]);
				}
				MyJButton jb = new MyJButton(showStr);
				jb.setBounds((x + width )* (j + 1) , y, width, height);
				jb.setFocusable(false); //   最关键的一句话 
				jb.setValue(keyint[i][j]); // 
				jb.addActionListener(this);
				this.add(jb);
			}
			x = 20;
			y = y + height + 20;
		}
		*/
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(1024, 800);
		//
		KeyboardTest kb = new KeyboardTest();
		frame.add(kb);
		frame.setVisible(true);
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		MyJButton jb = (MyJButton)e.getSource();
		int key = jb.getValue();
		System.out.println(key);
		robot.keyPress(key);
		robot.keyRelease(key);
	}
	// 初始化特殊字符 
	public void initUnChar(){
		uncharMap.put(192, "`");
		uncharMap.put(8, "退格");
		uncharMap.put(222, "'");
		uncharMap.put(KeyEvent.VK_CAPS_LOCK, "大/小写");
		uncharMap.put(10, "回车");
		uncharMap.put(16, "SHIFT");
		uncharMap.put(17, "CTRL");
		uncharMap.put(17, "ALT");
		uncharMap.put(38, "↑");
		uncharMap.put(37, "←");
		uncharMap.put(39, "→");
		uncharMap.put(40, "↓");
	}
	
	class MyJButton extends JButton{
		int value;
		public MyJButton(String showStr) {
			super(showStr);
		}
		public void setValue(int value) {
			this.value = value;
		}
		public int getValue() {
			return value;
		}
	}
	
	/**
	 * @title loadKeys
	 * @date 2018年4月18日
	 * @param line
	 * @param x
	 * @param y
	 * @param width
	 * @param height
	 * @description 加载键盘 
	 */
	public void loadKeys(int[] line,int startx,int cell,int x,int y ,int width,int height){
		// line 1
		for(int j = 0;j < line.length; j++){
			String showStr = uncharMap.get(line[j]); // 显示的字符
			if(showStr == null){
				showStr = String.valueOf((char) line[j]);
			}
			MyJButton jb = new MyJButton(showStr);
			jb.setBounds(startx + x + (cell + width) * j  , y, width, height);
			jb.setFocusable(false); //   最关键的一句话 
			jb.setValue(line[j]); // 
			jb.addActionListener(this);
			this.add(jb);
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值