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

12

我有一个包含大量不断变化的子组件(多层)的JFrame。有没有一种方法可以添加监听所有鼠标事件的方式?类似于KeyEventDispatcher?

5个回答

25

使用AWTEventListener来过滤鼠标事件:

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
此操作在未签名小程序中不被允许。 - lexicalscope
你真是个救星! - maddingl

6
你可以在整个JFrame上添加一个GlassPane,为其添加MouseInputAdapter以捕获所有可能的鼠标事件,然后使用[SwingUtilities.getDeepestComponentAt()] [3]获取实际组件并使用[SwingUtilities.convertMouseEvent()] [4]将鼠标事件从玻璃窗格委派给实际组件。
但是,我不确定这会对性能产生什么影响-与KeyEventDispatcher不同,后者只需要在按下键时触发事件,移动鼠标时会生成多个事件-并且与KeyEventDispatcher不同,您需要重新发送事件到较低的组件以处理它。
(抱歉-stackoverflow无法正确处理对SwingUtilities方法的链接...链接显示在下面而不是在文本中。)

[3]: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/SwingUtilities.html#getDeepestComponentAt(java.awt.Component,整数,整数) [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

0

将所有与鼠标相关的监听器实现在一个类中,并将该类注册为所有鼠标相关事件的处理程序

与鼠标相关的接口包括:

MouseListener MouseMotionListener MouseWheelListener


1
这种方法行不通,因为层次结构中只有一个组件会发布鼠标事件。因此,需要在层次结构中的每个组件上注册鼠标监听器。 - sullivan-

0

你可能想要实现MouseAdapter的子类,这是一个抽象类,提供了所有在Mouse*Listener接口中定义的方法的空实现。一旦你这样做了,当你创建子组件时,你可以将它注册为MouseListener。当你指示你的组件正在“改变”时,你需要确保在你的JFrame的生命周期内释放你的组件时也取消注册你的监听器。


MouseInputAdapter - MouseAdapter只是MouseListener(点击,无移动或滚轮)的一个实现。 - Nate
Nate,谢谢你的回复。看了代码后,我发现MouseAdapter实现了所有三个接口。 - akf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接