2011-11-22 112 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