当游标在子组件上时,JPanel不会生成MouseEvents

时间:2010-06-21 18:49:17

标签: java swing events jpanel listener

对我来说有点奇怪,但是当游标在子组件上时,JPanel不会生成MouseEvents:JTextField和JToolBar但是当游标在JLabel上时它会生成MouseEvents。有人能解释我为什么吗?有没有办法强制JPanel生成事件,即使鼠标在子组件上?

3 个答案:

答案 0 :(得分:3)

事件调度程序会将鼠标事件转发给注册到getMouseEventTarget中程序包级Container方法返回的组件的侦听器。这将在您的JFrame上调用,并且正如JavaDoc所示,它:

  

获取对接收鼠标事件感兴趣的最顶层(最深)轻量级组件。

事件调度程序然后获取此最顶层的组件(例如,您的JTextField)并仅将事件发送到其所有侦听器。他们这样做是为了避免必须将这些事件广播到可能在Swing容器中分层的所有组件。您可以想象,MouseEvents非常繁琐,所有mouseEnteredmouseDraggedmouseMoved事件都会被调度给所有MouseListener和{{{ 1}}实现可能在那里。找到所有侦听器然后向层次结构中的所有侦听器发送事件的处理将非常耗时。

对于像MouseMotionListenerJTextField等类这样的假设,默认的鼠标处理就是人们需要的。如果您想以不同方式处理鼠标操作(即,更改JButton / mouseEntered上的颜色),您可以根据需要向这些小部件添加mouseExited

如果您需要处理这些事件,我建议您将MouseListener作为JPanel添加到您的顶级组件中进行处理。

答案 1 :(得分:2)

您可能希望让子组件(JTextField,JToolBar等)侦听来自jpanel的鼠标事件和/或将鼠标事件转发给子组件。

答案 2 :(得分:1)

  

有人可以解释原因吗?

Component鼠标事件由processMouseEvent()处理,即

  

发生以下任一情况时启用鼠标事件:

     
      
  • 通过addMouseListener注册MouseListener对象。
  •   
  • 通过enableEvents启用鼠标事件。
  •   

您可以使用getMouseListeners()查看差异。