JFrame 内有 JPanel。
在 JPanel 中进行 addKeyListener 实现的代码不能被键盘动作触发;
而在 JFrame 中进行 addKeyListener 实现的代码却能被键盘动作触发;
直接在 JFrame 中用:
KeyListener[] _arKL = jPane.getKeyListeners();
for (int i = 0; i < _arKL.length; i++) {
this.addKeyListener(_arKL[i]);
}
即可将事件传递给 JPanel 中的实现代码,不过觉此法肤浅故请教Swing先人指点一二,不胜感激!
还查阅了部分资料,不知道是不是焦点问题?

解决方案 »

  1.   

    是 的,像键盘事件必须注册到顶级窗口类才有效,比如JFrame
      

  2.   

    public void addKeyListener(KeyListener l)    添加指定的按键侦听器,接收此组件发出的按键事件。如果 l 为 null,则不会抛出异常并且不执行操作。
      

  3.   

    lbfhappy(千里冰封) 
    > 事件注册到顶层控件是可以响应键盘事件的,但是如果此时控制的控件设置为没有焦点而又存在其他的带焦点的控件的话就会让此键盘事件失效。
      

  4.   

    对java不够了解、需努力了!!!不要直接向panel中添加键盘事件(add方法)、应该用类似下面的两种方法:
    1、
    KeyStroke shiftup = KeyStroke.getKeyStroke(KeyEvent.VK_UP,java.awt.event.InputEvent.SHIFT_DOWN_MASK);
    panel.registerKeyboardAction(this,"shiftup",shiftup,JComponent.WHEN_IN_FOCUSED_WINDOW);
    2、registerKeyboardAction()已经是不在被建议使用的方法。建议使用
    getInputMap().put(aKeyStroke,aCommand)和getActionMap().put(aCommand,aAction)来组合代替
      

  5.   

    dejinzhao()
    是对的,不过之前我自己也已经用这个方法解决这个问题了,过来结贴的。呵呵!不过还是要感谢下。