Вероятная проблема, с которой вы столкнулись, та же, с которой я столкнулся, в том, что ваше событие сожрано в вашей иерархии, как предполагалось предыдущим постером. Что касается ответа Camickr, это действительно не имеет значения, если вы продлите JPanel
или JLabel
, если вы знаете о последствиях. JPanel
предлагает вам гораздо больше возможностей и уже содержит много полезных вещей. Но давайте возьмем простой пример, где у вас есть следующее:
A JFrame
, который содержит JPanel
, назовите его JParent
. JParent
имеет набор слушателей мыши, выделенных для него.
JParent
содержит дочерний элемент JPanel
, который добавляется к его компонентам и называется JChild
. JChild
также имеет свой собственный набор слушателей мыши.
Что произошло, когда вы нажали на область, которая не занята JChild
? Вы получите ответ от слушателей JParent
. Если щелкнуть область с видимым JChild
, будут срабатывать только события мыши JChild
.
Так что будьте очень осторожны при отладке, поскольку свинг Java может вести себя иначе, чем вы могли бы привыкнуть в других реализациях рисования простых форм / графических интерфейсов. События в основном однократные, а компонент самого низкого уровня получает первые кубики. Если вы все равно попытаетесь запустить события родителя, ваши координаты x / y будут основаны на дочернем, а не на родительском. Я все еще пытаюсь найти хорошую работу вокруг себя, потому что мне нужен доступ конкретно к родителю, чтобы переместить объект в другое место.
Лучшее, что я могу придумать, это не беспорядок для отладки / размышления, это две идеи:
а) пусть каждый из ваших отдельных компонентов содержит свой собственный эксклюзивный набор событий и попытается предотвратить появление эффекта «пузырения».
б) обрабатывать все события на родительском
Я бы предпочел a, так как он позволяет избежать неприятных вещей, таких как проверка классов компонентов, просто чтобы выяснить, какую реакцию вы хотите (то есть, например, какое меню щелкнуть правой кнопкой мыши, чтобы показать).
Редактировать: Так что вы можете справиться с этим любым способом, который я обнаружил. Вы можете использовать сообщение dispatchEvent для пересылки событий обратно вверх по цепочке. В моем случае я должен сожрать первое событие (или изменить его) и отправить x-y позиции, как если бы они были относительно родителя (используя смещения). Я бы сказал, что лучший способ сделать это - пересылка, потому что тогда все ваши отдельные компоненты могут быть инкапсулированы.