2011-11-22 67 views
4

我有一个JPanel添加了一个网格JLabels。我想要一个MouseListener来收听MouseEvents,但JLabels似乎是在阻止,并且在JLabel所在位置点击时没有MouseEvent触发。如何聆听儿童组件?

是否有一种可靠的方式来收听组件的子项的MouseEvents

+0

无论何时添加组件,父节点是否可以将自己添加为侦听器? –

回答

8

MouseEvents被调度到为它们启用的最顶层(z顺序)组件,该组件已经在其上注册了mouseListener,或者在内部已经设置了eventMask来处理它们。虽然通常JLabel是透明的(因此事件应该到达底层面板),但它们可能会通过f.i获得事件不透明。设置一个工具提示。

在jdk 7中,您可以use a JLayer掌握所有(鼠标)传递给其子女的事件。的JLayer文档说:

JLayer是一个很好的解决方案,如果你只需要做的风俗画过 复合成分或将其从子捕捉输入事件。

它的前身jdk6是在SwingLabs中的JXLayer project。还有一种选择是使用AWTEventListener,如Rob's blog(注意:可能不允许在安全受限的上下文中)中所述。

+0

非常感谢您解释清楚的答案。我对每个JLabel都有工具提示,我甚至没有想到这一点。 –

+0

肯定是最好的和最重要的关于这个话题的答案 - 谢谢。 – Balder