估计是因为输入焦点不在这个panel上,这个panel中含有别的组件吗,如果有的话加上
public void paint(Graphics g)
{
  super.paint();
  requestFocus();
}
试试

解决方案 »

  1.   

    To GhostValley(鬼谷) 
    可以了,谢谢,但可以简单说一下原因吗??
      

  2.   

    这个问题我也遇到过.
    要想解决首先,用Panel.setFocusable(true)or覆盖isFocusable()返回true
    因为有些组件不直接支持键盘事件.
      

  3.   

    有一点地方需要注意,只有对已将建立了对等体(在awt中)或已经显示的组件调用requestFocus()才是有效的,所以在这里requestFocus()才放在paint()中,在java.awt.ComponentEvent接口中好像有一个方法是当组件showed时调用的(名字大概是COMPONENT_SHOW,我忘了,你查一下api吧),把requestFocus放在那个方法中更合适一些
      

  4.   

    to GhostValley(鬼谷) ,怎样查api啊,
    还有你的QQ是多少,我的是2731967.
    现在初学Java,想多点和你请教......
      

  5.   

    有一點請注意,大家不用這麼麻煩,如果註冊KeyListener接口的話,
    必須保證焦點在JPanel上,這樣處理很不方便.JComponent組件提供了registerKeyboardAction()方法,
    用來註冊熱鍵,無論焦點在不在註冊的組件上,都會響應按鍵事件.
    另外,需要閱讀KeyStroke,
    比如:
    ActionListener action = new ActionListener(){
        public void actionPerformed(ActionEvent e){
            dosomething() ;
        }
    }
    KeyStroke hotKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.CTRL_MASK) ;
    this.getRootPane().registerKeyboardAction(action,null,showMessageStroke,JComponent.WHEN_IN_FOCUSED_WINDOW) ;
      

  6.   

    setFocusable(true);
    requestFocusInWindow();
    就可以了哦
      

  7.   

    我办你查了,就是COMPONENT_SHOW
    在API在JDK的文档文件夹中,也可以在网上JAVA.SUN.COM右上角有个SEARCH
    EMAIL:[email protected]