键盘监听事件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();
    }
}

 

posted @ 2018-08-13 19:14  夕西行  阅读(525)  评论(0编辑  收藏  举报