Java 达人,我写了一个 java 程序,一个面板上有两个按钮,同时监听用户的按键操作。不添加按钮,按键操作的监听正常;添加按钮后,按键操作的监听就失效了。请达人指点迷津。十分感谢!代码如下:import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.SimpleDateFormat;
import java.util.Date;import javax.swing.*; 
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;public class Demo20 extends JFrame implements KeyListener{

private static final long serialVersionUID = 1L; public Demo20(){
this.setTitle("键盘事件处理");
this.setSize(300, 200);
this.setLocationRelativeTo(this);// 窗口居中
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭动作处理
this.addKeyListener(this);// 添加注册键盘事件监听器
this.setLayout(new FlowLayout(FlowLayout.LEFT,45,45));

JButton buttonPop = new JButton("Pop out");
this.add(buttonPop);

buttonPop.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
System.out.println("Pop up!");
} public void mousePressed(MouseEvent e) {
} public void mouseReleased(MouseEvent e) {
} public void mouseEntered(MouseEvent e) {
} public void mouseExited(MouseEvent e) {
}
});

JButton buttonPrint = new JButton("Print");
this.add(buttonPrint);

buttonPrint.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
System.out.println("Print!");
} public void mousePressed(MouseEvent e) {
} public void mouseReleased(MouseEvent e) {
} public void mouseEntered(MouseEvent e) {
} public void mouseExited(MouseEvent e) {
}
});
} @Override
public void keyPressed(KeyEvent arg0){// 敲击
} @Override
public void keyReleased(KeyEvent arg0) {// 按下
if (arg0.getKeyCode() == 114) {// 114 F3对应的编码
Demo10.print();
}

if (arg0.getKeyCode() == 80) {// 80 P 对应的编码
System.out.println("Key P is pressed!");
}
} @Override
public void keyTyped(KeyEvent arg0) {// 释放
} public static void main(String[] args) {
new Demo20();
} public static void print() {
System.out.println("Running!");
}
}

解决方案 »

  1.   

    当添加按钮以后 JFrame 就会丢失焦点所以我们要从新获取焦点。
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.text.SimpleDateFormat;
    import java.util.Date;import javax.swing.*; 
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;public class Demo20 extends JFrame implements KeyListener{
        
        private static final long serialVersionUID = 1L;    public Demo20(){
            this.setTitle("键盘事件处理");
            this.setSize(300, 200);
            this.setLocationRelativeTo(this);// 窗口居中
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭动作处理
            this.addKeyListener(this);// 添加注册键盘事件监听器
            this.setLayout(new FlowLayout(FlowLayout.LEFT,45,45));
            
            JButton buttonPop = new JButton("Pop out");
            this.add(buttonPop);
            
            buttonPop.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e) {
                    System.out.println("Pop up!");
                    Demo20.this.requestFocus();
                }            public void mousePressed(MouseEvent e) {
                }            public void mouseReleased(MouseEvent e) {
                }            public void mouseEntered(MouseEvent e) {
                }            public void mouseExited(MouseEvent e) {
                }
            });
            
            JButton buttonPrint = new JButton("Print");
            this.add(buttonPrint);
            
            buttonPrint.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e) {
                    System.out.println("Print!");
                    Demo20.this.requestFocus();
                }            public void mousePressed(MouseEvent e) {
                }            public void mouseReleased(MouseEvent e) {
                }            public void mouseEntered(MouseEvent e) {
                }            public void mouseExited(MouseEvent e) {
                }
            });
            this.requestFocus();
        }            @Override
        public void keyPressed(KeyEvent arg0){// 敲击
        }    @Override
        public void keyReleased(KeyEvent arg0) {// 按下
            if (arg0.getKeyCode() == 114) {// 114 F3对应的编码            
    //            Demo10.print();
            }
            
            if (arg0.getKeyCode() == 80) {// 80 P 对应的编码            
                System.out.println("Key P is pressed!");
            }
        }    @Override
        public void keyTyped(KeyEvent arg0) {// 释放
        }    public static void main(String[] args) {
            new Demo20();
        }    public static void print() {
            System.out.println("Running!");
        }
    }
      

  2.   

    加上注释
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.text.SimpleDateFormat;
    import java.util.Date;import javax.swing.*; 
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;public class Demo20 extends JFrame implements KeyListener{
        
        private static final long serialVersionUID = 1L;    public Demo20(){
            this.setTitle("键盘事件处理");
            this.setSize(300, 200);
            this.setLocationRelativeTo(this);// 窗口居中
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭动作处理
            this.addKeyListener(this);// 添加注册键盘事件监听器
            this.setLayout(new FlowLayout(FlowLayout.LEFT,45,45));
            
            JButton buttonPop = new JButton("Pop out");
            this.add(buttonPop);
            
            buttonPop.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e) {
                    System.out.println("Pop up!");
                    Demo20.this.requestFocus();//点击按钮后获取焦点
                }            public void mousePressed(MouseEvent e) {
                }            public void mouseReleased(MouseEvent e) {
                }            public void mouseEntered(MouseEvent e) {
                }            public void mouseExited(MouseEvent e) {
                }
            });
            
            JButton buttonPrint = new JButton("Print");
            this.add(buttonPrint);
            
            buttonPrint.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e) {
                    System.out.println("Print!");
                    Demo20.this.requestFocus();//点击按钮后获取焦点
                }            public void mousePressed(MouseEvent e) {
                }            public void mouseReleased(MouseEvent e) {
                }            public void mouseEntered(MouseEvent e) {
                }            public void mouseExited(MouseEvent e) {
                }
            });
            this.requestFocus();//创建完后先获取焦点。
        }            @Override
        public void keyPressed(KeyEvent arg0){// 敲击
        }    @Override
        public void keyReleased(KeyEvent arg0) {// 按下
            if (arg0.getKeyCode() == 114) {// 114 F3对应的编码            
    //            Demo10.print();
            }
            
            if (arg0.getKeyCode() == 80) {// 80 P 对应的编码            
                System.out.println("Key P is pressed!");
            }
        }    @Override
        public void keyTyped(KeyEvent arg0) {// 释放
        }    public static void main(String[] args) {
            new Demo20();
        }    public static void print() {
            System.out.println("Running!");
        }
    }
      

  3.   

    楼主不知道标准是这么做的。
    但我下面这样可以用。把按钮的key事件传给他parent也就是你的JFrame。
    (我只写了1个按钮的,另一个按钮同样。)        buttonPop.addKeyListener(new KeyListener() {
    @Override
    public void keyPressed(KeyEvent arg0) {
    Demo20.this.keyPressed(arg0);
    }
    @Override
    public void keyReleased(KeyEvent arg0) {
    Demo20.this.keyReleased(arg0);
    }
    @Override
    public void keyTyped(KeyEvent arg0) {
    Demo20.this.keyTyped(arg0);
    }        
            });
      

  4.   


    zhang5059的做法,你按tab键把焦点移到按钮上,key事件又会没得。
      

  5.   

    scbb,好厉害!!!我再改一下。非常感谢!