Как слушать дочерние компоненты?
У меня есть JPanel
с сеткой JLabels
добавлено. Я хотел бы MouseListener
слушать MouseEvents
, но JLabels
похоже на пути и нет MouseEvent
срабатывает при нажатии в месте, где JLabel
расположен.
Есть ли надежный способ слушать MouseEvents
дочерних компонентов?
1 ответ
MouseEvents отправляются в самый верхний (в z-порядке) компонент, который для них включен, для которого зарегистрирован mouseListener или внутренне настроил eventMask для их обработки. Хотя обычно JLabel прозрачен (и, следовательно, события должны доходить до базовой панели), они могут стать непрозрачными для события, если установить подсказку.
В jdk 7 вы можете использовать JLayer для получения всех (мышиных) событий, доставляемых его дочерним элементам. Документация JLayer
говорит:
JLayer - хорошее решение, если вам нужно только сделать пользовательский зарисовку над составным компонентом или перехватить входные события из его подкомпонентов.
Его предшественником для jdk6 является проект JXLayer в SwingLabs. Еще одним вариантом является использование AWTEventListener, как описано в блоге Роба (будьте осторожны: может быть запрещено в контексте с ограниченной безопасностью)