Как слушать дочерние компоненты? - PullRequest
4 голосов
/ 22 ноября 2011

У меня есть JPanel с добавленной сеткой JLabels.Я бы хотел, чтобы MouseListener прослушивал MouseEvents, но JLabels, кажется, мешает, и MouseEvent не срабатывает при нажатии в месте, где находится JLabel.

Есть ли надежный способ прослушать MouseEvents дочерних элементов компонента?

1 Ответ

8 голосов
/ 22 ноября 2011

MouseEvents отправляются в самый верхний (в z-порядке) компонент, который для них включен, для которого зарегистрирован mouseListener или внутренне настроил eventMask для их обработки. Хотя обычно JLabel является прозрачным (и, следовательно, события должны достигать базовой панели), они могут стать непрозрачными по событию f.i. настройка всплывающей подсказки.

В jdk 7 вы можете использовать JLayer , чтобы получить все (мышиные) события, доставленные его дочерним элементам. Документация JLayer гласит:

JLayer - хорошее решение, если вам нужно только покрасить поверх составной компонент или перехват входных событий из его подкомпонентов .

Его предшественником для jdk6 является проект JXLayer в SwingLabs. Еще одним вариантом является использование AWTEventListener, как описано в блоге Роба (будьте осторожны: может быть запрещено в контексте с ограниченной безопасностью)

...