我有一个JFrame,它有大量更改的子组件。 (很多层)有没有办法为所有鼠标事件添加一个监听器?像KeyEventDispatcher?
答案 0 :(得分:18)
使用AWTEventListener过滤掉MouseEvents:
long eventMask = AWTEvent.MOUSE_MOTION_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK;
Toolkit.getDefaultToolkit().addAWTEventListener( new AWTEventListener()
{
public void eventDispatched(AWTEvent e)
{
System.out.println(e);
}
}, eventMask);
答案 1 :(得分:7)
您可以在整个JFrame上添加GlassPane,为其添加MouseInputAdapter以获取所有可能的鼠标事件,然后使用[SwingUtilities.getDeepestComponentAt()] [3]来获取实际值组件和[SwingUtilities.convertMouseEvent()] [4]将鼠标事件从玻璃窗格委托给实际组件。
但是,我不确定这对性能的影响 - 与KeyEventDispatcher不同,KeyEventDispatcher只需要在按下某个键时触发事件,当用户移动鼠标时会生成多个事件 - 与KeyEventDispatcher不同,您需要将事件重新发送到下部组件以便处理它。
(抱歉 - stackoverflow没有正确处理SwingUtilities方法的链接......链接显示在下面而不是文本中。)
[3]:http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/SwingUtilities.html#getDeepestComponentAt(java.awt.Component,int,int) [4]:http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/SwingUtilities.html#convertMouseEvent(java.awt.Component,java.awt.event.MouseEvent,java.awt.Component)
答案 2 :(得分:2)
你必须使用JFrame的glassPane: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JFrame.html#getGlassPane()
只需使用frm.getGlassPane()获取JFrame的玻璃窗格,并使用addMouseListener()捕获窗口内的所有鼠标事件。
答案 3 :(得分:0)
在类中实现所有与鼠标相关的侦听器,并将该类注册为所有鼠标相关事件的处理程序
鼠标相关接口将是
的MouseListener 的MouseMotionListener MouseWheelListener的
答案 4 :(得分:0)
您可能希望实现MouseAdapter
的子类,这是一个抽象类,它提供Mouse*Listener
接口中定义的所有方法的空实现。完成后,您可以在创建时将其与子组件一起注册为MouseListener
。当您指示您的组件正在“更改”时,如果您希望在JFrame的生命周期内发布组件,则需要确保您也取消注册您的侦听器。