JPanel не генерирует MouseEvents, когда курсор находится на дочерних компонентах - PullRequest
3 голосов
/ 21 июня 2010

Это немного странно для меня, но JPanel не генерирует MouseEvents, когда курсор находится на дочерних компонентах: JTextField и JToolBar, но генерирует MouseEvents, когда курсор находится на JLabel.Может ли кто-нибудь объяснить мне, почему?Есть ли способ заставить JPanel генерировать события, даже если мышь находится на дочерних компонентах?

Ответы [ 3 ]

3 голосов
/ 22 июня 2010

Диспетчер событий будет пересылать события мыши слушателям, зарегистрированным для компонента, который возвращается методом getMouseEventTarget уровня пакета в Container.Это будет вызвано на вашем JFrame, и, как указывает JavaDoc, оно:

Извлекает самый верхний (самый глубокий) легкий компонент, который заинтересован в получении событий мыши.

Диспетчер событий затем берет этот самый верхний компонент (например, JTextField) и отправляет события только всем его слушателям.Они делают это, чтобы избежать необходимости передавать эти события всем компонентам, которые могут быть наслоены в контейнере Swing.MouseEvents, как вы можете себе представить, очень разговорчивы, что со всеми событиями mouseEntered, mouseDragged и mouseMoved, которые отправляются для всех реализаций MouseListener и MouseMotionListener, которые потенциально могут существовать.Обработка для нахождения всех слушателей, а затем запуска событий для всех них в иерархии будет занимать много времени.

Предполагается также, что для таких классов, как JTextField, JButton и т. Д., Мышь по умолчаниюобработка - это все, что нужно.Если вы хотите обрабатывать действия мыши по-разному (т. Е. Менять цвет на mouseEntered / mouseExited), вы можете добавить MouseListener к этим виджетам по мере необходимости.

Для вашей обработки я бы предложил просто добавить JPanel как MouseListener к компонентам верхнего уровня, если вам нужно обработать эти события.

2 голосов
/ 21 июня 2010

вы можете захотеть, чтобы дочерние компоненты (JTextField, JToolBar и т. Д.) Прослушивали события мыши из jpanel и / или пересылали события мыши дочерним компонентам.

1 голос
/ 21 июня 2010

Может кто-нибудь объяснить, почему?

Component события мыши обрабатываются processMouseEvent(), что говорит

Мышьсобытия включаются, когда происходит одно из следующих действий:

  • Объект MouseListener регистрируется через addMouseListener.
  • События мыши включаются через enableEvents.

Вы можете использовать getMouseListeners(), чтобы увидеть разницу.

...