如何捕获JFrame / Swing中的所有鼠标事件?

时间:2009-07-27 03:49:11

标签: java swing

我有一个JFrame,它有大量更改的子组件。 (很多层)有没有办法为所有鼠标事件添加一个监听器?像KeyEventDispatcher?

5 个答案:

答案 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的生命周期内发布组件,则需要确保您也取消注册您的侦听器。