对我来说有点奇怪,但是当游标在子组件上时,JPanel不会生成MouseEvents:JTextField和JToolBar但是当游标在JLabel上时它会生成MouseEvents。有人能解释我为什么吗?有没有办法强制JPanel生成事件,即使鼠标在子组件上?
答案 0 :(得分:3)
事件调度程序会将鼠标事件转发给注册到getMouseEventTarget
中程序包级Container
方法返回的组件的侦听器。这将在您的JFrame
上调用,并且正如JavaDoc所示,它:
获取对接收鼠标事件感兴趣的最顶层(最深)轻量级组件。
事件调度程序然后获取此最顶层的组件(例如,您的JTextField
)并仅将事件发送到其所有侦听器。他们这样做是为了避免必须将这些事件广播到可能在Swing容器中分层的所有组件。您可以想象,MouseEvents非常繁琐,所有mouseEntered
,mouseDragged
和mouseMoved
事件都会被调度给所有MouseListener
和{{{ 1}}实现可能在那里。找到所有侦听器然后向层次结构中的所有侦听器发送事件的处理将非常耗时。
对于像MouseMotionListener
和JTextField
等类这样的假设,默认的鼠标处理就是人们需要的。如果您想以不同方式处理鼠标操作(即,更改JButton
/ mouseEntered
上的颜色),您可以根据需要向这些小部件添加mouseExited
。
如果您需要处理这些事件,我建议您将MouseListener
作为JPanel
添加到您的顶级组件中进行处理。
答案 1 :(得分:2)
您可能希望让子组件(JTextField,JToolBar等)侦听来自jpanel的鼠标事件和/或将鼠标事件转发给子组件。
答案 2 :(得分:1)
有人可以解释原因吗?
Component
鼠标事件由processMouseEvent()
处理,即
发生以下任一情况时启用鼠标事件:
- 通过addMouseListener注册MouseListener对象。
- 通过enableEvents启用鼠标事件。
您可以使用getMouseListeners()
查看差异。