KeyListener listener=new KeyListener(){......};  //键盘事件类省略
JFrame frame=new JFrame();
JPanel panel1=new JPanel();
panel1.addKeyListener(listener);                 //panel1注册事件
frame.getContentPane().add(panel1);              //框架加入组件panel1
frame.setVisible(true);//此时键盘事件工作正常frame.getContentPane().remove(panel1);           //框架移除组件panel1
JPanel panel2=new JPanel();                        
panel2.addKeyListener(listener);                 //panel1注册事件
frame.getContentPane().add(panel2);              //框架加入组件panel2
validate();                                      //重新显示//此时面板能正常显示,但是键盘事件没有响应//我尝试不用remove,validate方法,而是把panel2直接放到一个新的JFrame里面,键盘事件工作正常
//知道原因的麻烦说明,并且给出建议

解决方案 »

  1.   

    应该是被监听的JPanel组件没有得到焦点吧。import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;public class TestKeyListener {
    private JFrame frame = null;
    private JPanel pane_1 = null, pane_2 = null;
    private JButton button = null;
    private MyKeyListener myListener = null;

    public TestKeyListener() {
    frame = new JFrame("Test Key Listener");
    pane_1 = new JPanel();
    pane_2 = new JPanel();
    button = new JButton("JPanel_2");
    button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
    frame.getContentPane().removeAll();
    pane_2.addKeyListener(myListener);
    frame.getContentPane().add(pane_2);
    frame.validate();
    pane_2.requestFocus();
    }});
    myListener = new MyKeyListener();
    pane_1.addKeyListener(myListener);
    frame.getContentPane().add(button, BorderLayout.NORTH);
    frame.getContentPane().add(pane_1);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 200);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    pane_1.requestFocus();
    }

    public static void main(String args[]) {
            new TestKeyListener();
        }}
    class MyKeyListener implements KeyListener{ public void keyPressed(KeyEvent e) {
    System.out.println(e.getKeyChar());
    } public void keyReleased(KeyEvent e) {
    } public void keyTyped(KeyEvent e) {
    }

    }