键盘监听事件KeyListener
说明:按下实体按键,相应虚拟按键变绿色,释放按键,变白色。
public class Demo extends JFrame { private List<JButton> list;//定义变量,否则自定义方法类中,不识别 // JPanel p1; 边界布局,中心区域放置文本框tf // JPanel p2; 绝对布局,放置面板p21,p22,p23 // JPanel p21; 流布局,第一行键盘按钮 // JPanel p22; 流布局,第二行键盘按钮 // JPanel p23; 流布局,第三行键盘按钮 public Demo() { //设置窗体大小,不可更改。 setBounds(100, 100, 548, 280); setResizable(false); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(null);//绝对布局,上下两个Jpanel面板 //p1 边界布局,中心区域放置文本框tf //p2 绝对布局,放置面板p21,p22,p23 //p21 流布局,第一行键盘按钮 //p22 流布局,第二行键盘按钮 //p23 流布局,第三行键盘按钮 JPanel p1 = new JPanel(); p1.setBounds(0, 0, 540, 45); p1.setBackground(Color.WHITE); p1.setBorder(BorderFactory.createTitledBorder("文本显示区")); p1.setLayout(new BorderLayout());//边界布局 JTextField tf = new JTextField(); p1.add(tf, BorderLayout.CENTER);//文本框放中间区域 c.add(p1); //面板2 //绝对布局,放置面板p21,p22,p23 JPanel p2 = new JPanel(); p2.setBounds(0, 45, 540, 205); p2.setBackground(Color.WHITE); p2.setLayout(null); c.add(p2); //面板21 //流布局,第一行键盘按钮 JPanel p21 = new JPanel(); p21.setBounds(0, 10, 540, 55); p21.setLayout(new FlowLayout()); p2.add(p21); //面板22 //流布局,第二行键盘按钮 JPanel p22 = new JPanel(); p22.setBounds(0, 75, 540, 55); p22.setLayout(new FlowLayout()); p2.add(p22); //面板23 //流布局,第三行键盘按钮 JPanel p23 = new JPanel(); p23.setBounds(0, 140, 540, 55); p23.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 5)); p2.add(p23); /**按钮*/ JButton btnQ = new JButton("Q"); btnQ.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnQ.setBackground(Color.WHITE); //btnQ.setSize(45,45);//在一些布局中,setSize失效,不起作用。 btnQ.setPreferredSize(new Dimension(45, 45)); p21.add(btnQ); JButton btnW = new JButton("W"); btnW.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnW.setBackground(Color.WHITE); btnW.setPreferredSize(new Dimension(46, 45)); p21.add(btnW); JButton btnE = new JButton("E"); btnE.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnE.setBackground(Color.WHITE); btnE.setPreferredSize(new Dimension(45, 45)); p21.add(btnE); JButton btnR = new JButton("R"); btnR.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnR.setBackground(Color.WHITE); btnR.setPreferredSize(new Dimension(45, 45)); p21.add(btnR); JButton btnT = new JButton("T"); btnT.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnT.setBackground(Color.WHITE); btnT.setPreferredSize(new Dimension(45, 45)); p21.add(btnT); JButton btnY = new JButton("Y"); btnY.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnY.setBackground(Color.WHITE); btnY.setPreferredSize(new Dimension(45, 45)); p21.add(btnY); JButton btnU = new JButton("U"); btnU.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnU.setBackground(Color.WHITE); btnU.setPreferredSize(new Dimension(45, 45)); p21.add(btnU); JButton btnI = new JButton("I"); btnI.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnI.setBackground(Color.WHITE); btnI.setPreferredSize(new Dimension(45, 45)); p21.add(btnI); JButton btnO = new JButton("O"); btnO.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnO.setBackground(Color.WHITE); btnO.setPreferredSize(new Dimension(45, 45)); p21.add(btnO); JButton btnP = new JButton("P"); btnP.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnP.setBackground(Color.WHITE); btnP.setPreferredSize(new Dimension(45, 45)); p21.add(btnP); JButton btnA = new JButton("A"); btnA.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnA.setBackground(Color.WHITE); btnA.setPreferredSize(new Dimension(45, 45)); p22.add(btnA); JButton btnS = new JButton("S"); btnS.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnS.setBackground(Color.WHITE); btnS.setPreferredSize(new Dimension(45, 45)); p22.add(btnS); JButton btnD = new JButton("D"); btnD.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnD.setBackground(Color.WHITE); btnD.setPreferredSize(new Dimension(45, 45)); p22.add(btnD); JButton btnF = new JButton("F"); btnF.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnF.setBackground(Color.WHITE); btnF.setPreferredSize(new Dimension(45, 45)); p22.add(btnF); JButton btnG = new JButton("G"); btnG.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnG.setBackground(Color.WHITE); btnG.setPreferredSize(new Dimension(45, 45)); p22.add(btnG); JButton btnH = new JButton("H"); btnH.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnH.setBackground(Color.WHITE); btnH.setPreferredSize(new Dimension(45, 45)); p22.add(btnH); JButton btnJ = new JButton("J"); btnJ.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnJ.setBackground(Color.WHITE); btnJ.setPreferredSize(new Dimension(45, 45)); p22.add(btnJ); JButton btnK = new JButton("K"); btnK.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnK.setBackground(Color.WHITE); btnK.setPreferredSize(new Dimension(45, 45)); p22.add(btnK); JButton btnL = new JButton("L"); btnL.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnL.setBackground(Color.WHITE); btnL.setPreferredSize(new Dimension(45, 45)); p22.add(btnL); JButton btnZ = new JButton("Z"); btnZ.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnZ.setBackground(Color.WHITE); btnZ.setPreferredSize(new Dimension(45, 45)); p23.add(btnZ); JButton btnX = new JButton("X"); btnX.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnX.setBackground(Color.WHITE); btnX.setPreferredSize(new Dimension(45, 45)); p23.add(btnX); JButton btnC = new JButton("C"); btnC.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnC.setBackground(Color.WHITE); btnC.setPreferredSize(new Dimension(45, 45)); p23.add(btnC); JButton btnV = new JButton("V"); btnV.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnV.setBackground(Color.WHITE); btnV.setPreferredSize(new Dimension(45, 45)); p23.add(btnV); JButton btnB = new JButton("B"); btnB.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnB.setBackground(Color.WHITE); btnB.setPreferredSize(new Dimension(45, 45)); p23.add(btnB); JButton btnN = new JButton("N"); btnN.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnN.setBackground(Color.WHITE); btnN.setPreferredSize(new Dimension(45, 45)); p23.add(btnN); JButton btnM = new JButton("M"); btnM.setVerticalAlignment(SwingConstants.TOP);//位于顶部 btnM.setBackground(Color.WHITE); btnM.setPreferredSize(new Dimension(45, 45)); p23.add(btnM); tf.addKeyListener(new MyKeyListener());//调用自定义方法 setVisible(true); /**为什么要用 List list = new ArrayList(),而不用 ArrayList list = new ArrayList()呢? List接口有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如 LinkedList或Vector等,这时你只要改变这一行就行了:List list = new LinkedList(); 其它使用了list地方的代码不需要改动。*/ list = new ArrayList<>();//创建list,用来存放所有按钮控件 Component[] items1 = p21.getComponents(); //返回容器中所有控件 Component[] items2 = p22.getComponents();// Component[] items3 = p23.getComponents(); //p2.getComponents()只能识别到上一级子控件,控件中的控件无法识别。 //创建空的items数组,依次存放三个数组,达到合并数组的目的。 Component[] items = new Component[items1.length + items2.length + items3.length]; System.arraycopy(items1, 0, items, 0, items1.length); System.arraycopy(items2, 0, items, items1.length, items2.length); System.arraycopy(items3, 0, items, items1.length + items2.length, items3.length); for (Component item : items) {//找出items数组中的按钮控件 if (item instanceof JButton) {//如果这个控件是按钮,放入list中 list.add((JButton) item);//Component类强制转换为JButton类 } } } //在MyKeyListener上,Alt+Ins,快速创建方法。按下为绿,释放为白 class MyKeyListener implements KeyListener { public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { char ch = e.getKeyChar();//获取实体按键的字符 for (JButton btn : list) { String btnText = btn.getText();//获取虚拟按键的字符串 //判断字符是否相等(忽略大小写) if (btnText.equalsIgnoreCase(String.valueOf(ch))) { btn.setBackground(Color.GREEN); } } } public void keyReleased(KeyEvent e) { char ch = e.getKeyChar();//获取实体按键的字符 for (JButton btn : list) { String btnText = btn.getText();//获取虚拟按键的字符串 //判断字符是否相等(忽略大小写) if (btnText.equalsIgnoreCase(String.valueOf(ch))) { btn.setBackground(Color.WHITE); } } } /**单独按键,构造方法 public void keyTyped(KeyEvent e) {//自动生成,不可删除 } public void keyPressed(KeyEvent e) { int code = e.getKeyCode();//获得实体键盘上的按键编码,getKeyChar()方法也可以 switch (code) { case KeyEvent.VK_A://如果是实体A键的编码,窗体上的btnA变绿 btnA.setBackground(Color.GREEN); break; } } public void keyReleased(KeyEvent e) { int code = e.getKeyCode(); switch (code) { case KeyEvent.VK_A: btnA.setBackground(Color.WHITE); break; } } */ } public static void main(String[] args) { new Demo(); } }