我写了如下程序:
/**
 * 
 */
package netTest;import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
 * @author bluestone
 *
 */
public class Test1 extends JFrame {
    JButton b;
    JLabel l;
    public Test1(){
        JButton b = new JButton("test");
        
        JLabel l = new JLabel("nothing");
        JPanel p = new JPanel();
        p.add(b);
        getContentPane().setLayout(new GridLayout(1,2));
        getContentPane().add(p);
        getContentPane().add(l);
//注释1       addKeyListener(new MyListener());
        l.addKeyListener(new MyListener());
        p.addKeyListener(new MyListener());
        b.addKeyListener(new MyListener());
    }    /**
     * @param args
     */
    public static void main(String[] args) {
        Test1 t = new Test1();
        t.preferredSize();
        t.show();
        // TODO Auto-generated method stub    }
/*
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }    public void keyPressed(KeyEvent e) {
        System.out.println(e.getKeyChar());
//        l.setText(""+e.getKeyChar());
        // TODO Auto-generated method stub
        
    }    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }
*/    
    class MyListener implements KeyListener{        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
            
        }        public void keyPressed(KeyEvent e) {
            System.out.println(e.getKeyChar());
            // TODO Auto-generated method stub
            
        }        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
            
        }
        
    }
 
}
现在可以运行,也能够响应键盘,但是当我把注释1加上,而去掉其后的三个组件的addkeylistener之后,这个程序就无法响应键盘。但是事实上我只是要其中的一个组件(或者是整个Frame)响应键盘就可以了,其他组件是不必要的,比如说让一个按钮响应键盘就是没有必要的?但是为什么必须全都注册了keylistener,整个程序才能响应键盘呢?这个实在是太奇怪了!

解决方案 »

  1.   

    不同的控件对键盘事件有不同的响应,
    所以都需要添加KeyListener
      

  2.   

    一个Component要能够响应键盘事件,必须是可以获得焦点的,所有我猜测你上面的代码只要保留b.addKeyListener就可以。而要能够获得焦点,需要满足三个要求,根据Sun的Java Tuturial,是visible, enabled, and focusable。而Frame似乎不满足此要求,所以不能响应键盘事件