当有一个包含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,我无法再处理关键事件。
我想这可能是因为焦点已经以某种方式转移到该面板,但根本不确定。
身体是否知道这一点并且可以帮助我?
非常感谢
我建议你使用InputMap
和WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
或类似的东西。 摘自如何使用键绑定 :
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
该组件包含(或是)具有焦点的组件。 此输入映射通常用于复合组件
这对我来说非常有效。 有关更多信息和实际代码示例,请查看我的其他post:
用Java编写游戏的键盘输入
或者本教程:
Swing:了解输入/动作映射
您不应该使用KeyListener。
Swing旨在使用Key Bindings,它更加灵活。 查看我的Key Bindings的快速摘要,其中还包含Swing教程的链接,该教程具有更多细节。
(我不能在这里发布图片,因为我是新用户)
无论如何,图像无济于事。 如果您需要更多帮助,请发布您的SSCCE以显示问题(在尝试上述建议后)。