当有一个包含JButton的子组件时,JPanel不会监听键事件

我正在为我的大学项目编写地图编辑器。 而且我遇到了一个问题,即地图面板不应该正在监听关键事件。 当我添加一个ToolBarPane(扩展JPanel)时,会发生这种情况,例如JButton,JComboBox,它实现了ActionListener,地图面板(将JPanel扩展)一起放到了Frame(我使用了BorderLayout)。 我有System.out.println语句来测试是否收到按键,并且它不打印,如果我删除了ToolBar,键监听器再次工作,那么mouseListenner被禁用就像keyListener一样,这意味着我可以’ t处理新闻事件等,但mouseListener工作正常,我仍然可以处理鼠标移动事件。

这是一个没有ToolBarPane的屏幕截图

http://img684.imageshack.us/img684/3232/sampleku.png

请注意,您可以使用鼠标将图像放在地图上,您也可以像使用激光工具一样使用鼠标选择图像,按数字键可以在不同的图像之间切换,这样可以正常工作,直到我添加显示的ToolBarPane像这样:

img291.imageshack.us/img291/8020/failve.png(请在此之前添加http,我只能发布一个超链接)

(我不能在这里发布图片,因为我是新用户)

使用ToolBarPane,我无法再处理关键事件。

我想这可能是因为焦点已经以某种方式转移到该面板,但根本不确定。

身体是否知道这一点并且可以帮助我?

非常感谢

我建议你使用InputMapWHEN_ANCESTOR_OF_FOCUSED_COMPONENT或类似的东西。 摘自如何使用键绑定 :

JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
该组件包含(或是)具有焦点的组件。 此输入映射通常用于复合组件

这对我来说非常有效。 有关更多信息和实际代码示例,请查看我的其他post:

用Java编写游戏的键盘输入

或者本教程:

Swing:了解输入/动作映射

您不应该使用KeyListener。

Swing旨在使用Key Bindings,它更加灵活。 查看我的Key Bindings的快速摘要,其中还包含Swing教程的链接,该教程具有更多细节。

(我不能在这里发布图片,因为我是新用户)

无论如何,图像无济于事。 如果您需要更多帮助,请发布您的SSCCE以显示问题(在尝试上述建议后)。