对我来说有点奇怪,但是当鼠标指针位于子组件:JTextField和JToolBar上时,JPanel不会生成MouseEvents,但当鼠标指针位于JLabel上时,它会生成MouseEvents。有人能解释一下为什么吗?是否有办法强制JPanel生成事件,即使鼠标位于子组件上?
Container
中的包级别getMouseEventTarget
方法返回的组件上注册的侦听器。该方法将在您的JFrame
上调用,并且如JavaDoc所示,它会:
然后,事件分派程序将获取这个最顶层组件(例如您的获取最深处对接收鼠标事件感兴趣的轻量级组件。
JTextField
)并仅向其所有侦听器发送事件。他们这样做是为了避免将这些事件广播到可能位于Swing容器内部的所有组件。可以想象,鼠标事件非常繁琐,因为所有可能存在的MouseListener
和MouseMotionListener
实现都会发出mouseEntered
,mouseDragged
和mouseMoved
事件。找到所有侦听器并将事件发送到层次结构中的所有侦听器的处理将耗费很长时间。JTextField
和JButton
等类的默认鼠标处理是人们需要的全部。如果您想以不同方式处理鼠标操作(例如,在mouseEntered
/mouseExited
上更改颜色),则可以根据需要将MouseListener
添加到这些小部件中。JPanel
作为MouseListener
添加到顶层组件中即可。getMouseEventTarget()
在 java.awt
中是 _包访问权限_(没有明确的修饰符),但大多数 IDE 允许浏览源代码。 - trashgod您可能希望让子组件(如JTextField、JToolBar等)监听来自JPanel的鼠标事件,或将鼠标事件转发到子组件。
JPanel
。https://dev59.com/e0vSa4cB1Zd3GeqPf6K- - trashgodprocessMouseEvent()
处理 {{Component}} 鼠标事件,它说:getMouseListeners()
来查看区别。getListeners()
ж”ҜжҢҒзұ»еӯ—йқўзұ»еһӢж Үи®°пјҢе°ұеғҸEventListenerList
дёҖж ·гҖӮдёҚе№ёзҡ„жҳҜпјҢ+1еҘҪеғҸж¶ҲеӨұдәҶгҖӮ :-) - trashgod