在软件开发的过程中,涉及到触屏键盘的设计问题,利用Java 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; /* 设置Java键盘本质上利用swing图形界面控制相关的知识,来在JFrame中搭建一个键盘界面,实现利用键盘控制输入,* 电脑键盘的主面板主体包含有二十六个字母和诗歌数字以及其他相关字符,如果利用按钮时间一个一个实现,那将花费* 太多的时间和经历, 故而在这个例子中,很好地利用了数组,即将键盘中的 键按行 来分为五个数组,每个数组包含一* 行键盘的字符,利用数组来实现键盘的设置,*/public class tEST1 extends JPanel implements ActionListener{JTextField text  ;Robot robot;  //line1到line5分别表示键盘的第一排到第五排,在Java中,每一个键有自己的keycode值,//例如:0~9的keycode是48~57,A~Z是65~90;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到\ 没有tabint[] 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、windowMap<Integer, String> uncharMap = new HashMap<Integer, String>(); // 特殊字符public tEST1() {// 获取当前大小写//boolean isUpper = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);//System.out.println("当前是否大写:"+isUpper);// 模拟输入try {robot = new Robot();} catch (AWTException e) {// TODO Auto-generated catch blocke.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 的asciiint[][] keyint = new int[5][];//定义一个五行的二维数组keyint[0] = line1;keyint[1] = line2;keyint[2] = line3;keyint[3] = line4;keyint[4] = line5;y = y + height + 20;//height=40;// load keys  int startx = 0,cellspace = 7;loadKeys(line1,startx,cellspace,x, y, width, height);y = y + height + 20;    // line2int[] 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);// line4y = 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) {     //定义一个容器,用来实例化tEST1类,放入虚拟键盘 JFrame frame = new JFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(1024, 800);tEST1 kb = new tEST1();frame.add(kb);frame.setVisible(true);     } @Overridepublic 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{             //定义一个JButton类int value;public MyJButton(String showStr) {super(showStr);}public void setValue(int value) {this.value = value;}public int getValue() {return value;}} /**loadKey方法体的主要作用是将每个字符定义为键,利用按钮来控制输入输出有七个参数,* 难度在于在每个按钮上显示相应的字母和设置一行键的相对坐标位置,设计的参数有键盘在容器中的相对位置,* 键盘每一行的起始坐标,键与键之间的间隔,* line[]用来表示数组,一个数组中含有多个按键,可以依次加载键盘* startx值表示键盘每一行的初始位置,cellspace表示每个键之间的间隔* x代表键盘在容器中横向坐标,y代表键盘在容器中的纵向坐标,也就是键盘相对于jframe的相对位置* width和height分别代表按钮的长宽,也就是按钮的大小,*/public void loadKeys(int[] line,int startx,int cell,int x,int y ,int width,int height){// line 1for(int j = 0;j < line.length; j++){String showStr = uncharMap.get(line[j]); // 显示的字符,利用showstr来获取每个键的字符,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);}}
}

运行结果如下:

Java 虚拟键盘相关推荐

  1. java虚拟键盘_web虚拟键盘VirtualKeyboard

    最近做项目,我负责做网页前端,客户需要利用触摸屏进行操作,不外接鼠标键盘,但要求能录入文字,包括数字,英文,中文.思考了一下,决定用JS实现虚拟键盘. 首先上网搜索了一下JS虚拟键盘,在经过仔细筛选后 ...

  2. java弹出虚拟键盘_JS实现电脑虚拟键盘的操作

    本文实例为大家分享了JS实现电脑虚拟键盘的具体代码,供大家参考,具体内容如下 需求: 1.当输入框光标聚焦时,电脑虚拟键盘弹出 2.在输入框输入内容时,键盘跟着变化 具体实现代码如下: Html部分: ...

  3. 安卓虚拟键盘_安卓这些年变化多惊人?那些老玩家才懂的回忆

    1安卓曾经的界面你记得吗回顶部 [PConline杂谈]新一代安卓系统很快就要正式和大家见面了,目前安卓10的前身安卓Q已经向Pixel设备推送了测试版,而安卓Q之中的"Q"到底会 ...

  4. [高通SDM450][Android9.0]外接键盘闪屏以及默认使用虚拟键盘

    文章目录 开发平台基本信息 问题描述 解决方法 拔插外接键盘闪屏 默认使用虚拟键盘 开发平台基本信息 芯片: SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 公 ...

  5. 易语言dd驱动模拟按键模块_DD虚拟键盘虚拟鼠标

    简介: 最多用户选择,最简单易用,最稳定可靠 永久免费 系统底层集成,真正的驱动级硬件模拟 一键安装,即为电脑添加一对可完全编程控制的键盘鼠标,轻松自动化操作电脑 适用VB6,DELPHI,VC,BC ...

  6. 安卓虚拟键盘_安卓这些年变化多惊人?老玩家的回忆杀

    新一代安卓系统很快就要正式和大家见面了,目前安卓10的前身安卓Q已经向Pixel设备推送了测试版,而安卓Q之中的"Q"到底会是什么甜品,也成为了大家热议的话题.算起来,安卓数字版本 ...

  7. iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘

    原文地址:http://blog.csdn.net/xiaotanyu13/article/details/7711954 iOS上面对键盘的处理很不人性化,所以这些功能都需要自己来实现, 首先是点击 ...

  8. 如何使用 OpenCV 开发虚拟键盘

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 介绍 OpenCV 是最流行的计算机视觉任务库,它是用于机器学习. ...

  9. 手机虚拟摄像头_没键盘也能打字?三星展示最新虚拟键盘Selfie Type:是真的

    1月8日消息,三星在近日举行的2020 CES国际消费电子展上展示了虚拟键盘Selfie Type,它是一款全新的概念产品,由三星内部的创意实验室C-Lab研发,能够通过手机的前置摄像头来智能识别用户 ...

最新文章

  1. 轻松使用OpenCV Python控制Webcam,读取Barcode
  2. Excel导出多sheet单sheet通用型(poi)
  3. Android Json操作
  4. 计算机科学家Erik Meijer眼中的Hacker Way工作方式
  5. 推荐3款移动端网页开发调试神器
  6. index.wxss 导入不显示结果
  7. 基于android的视频采集系统的设计与实现,基于Android的视频采集系统的设计与实现...
  8. RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍
  9. java线程同步re_Java线程:线程的同步
  10. CentOS 7 忘记root密码的解决之道
  11. React router 路由 入门安装
  12. c语言prn文件,C语言prntf和scanf函数.doc
  13. 【微信小程序】微信公众平台合法域名设置
  14. 展开式求和(c语言)
  15. 他把自己估值上万亿美元的项目免费化了.....
  16. JS 将Table数据导出到Excel表
  17. NISP一级考试题目复习
  18. linux net子系统-系统调用层
  19. 多孔材料负载纳米/二氧化锰包覆碳纳米管的芯-壳型复合材料
  20. clamp.js 使用

热门文章

  1. k44.第十七章 K8s运维篇-DevOps 持续集成 持续部署 (四)
  2. Vue中,有哪些烂熟于心的知识
  3. 【文献综述】光流法的过去,现在和发展趋势
  4. 为什么说现在是布局Filecoin的最佳时机?
  5. Presentation 技巧总结
  6. 《乡村爱情6》七月宾县开机
  7. 常用软件最新版本注册码
  8. Windows+L键不能锁屏解决方案
  9. 正则表达式判断电话号码
  10. 读书笔记:《自卑与超越》