使用AWTEventListener的全局事件监听器以及如何从中提取MouseEvent

以下问题基于以下信息。 向下滚动以查看实际问题 – 它特指控制台输出。

我已经删除了所有内容,并提供了一个简单的程序来重现以下输出:

import java.awt.AWTEvent; import java.awt.Toolkit; import java.awt.event.AWTEventListener; import javax.swing.JFrame; public class Main { static Toolkit tk = Toolkit.getDefaultToolkit(); static long eventMask = AWTEvent.MOUSE_MOTION_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK + AWTEvent.KEY_EVENT_MASK; public static void main(String[] args) { tk.addAWTEventListener(new AWTEventListener() { @Override public void eventDispatched(AWTEvent e) { System.out.println(e.getID() + ", " + e); } }, eventMask); JFrame test = new JFrame(); test.setBounds(0, 0, 100, 100); test.setVisible(true); } } 

您将看到它在控制台中提供以下输出:

 500, java.awt.event.MouseEvent[MOUSE_CLICKED,(71,54),absolute(71,54),button=1,modifiers=Button1,clickCount=1] on frame0 501, java.awt.event.MouseEvent[MOUSE_PRESSED,(71,54),absolute(71,54),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on frame0 506, java.awt.event.MouseEvent[MOUSE_DRAGGED,(70,54),absolute(70,54),modifiers=Button1,extModifiers=Button1,clickCount=0] on frame0 502, java.awt.event.MouseEvent[MOUSE_RELEASED,(67,54),absolute(67,54),button=1,modifiers=Button1,clickCount=1] on frame0 503, java.awt.event.MouseEvent[MOUSE_MOVED,(67,55),absolute(67,55),clickCount=0] on frame0 503, java.awt.event.MouseEvent[MOUSE_MOVED,(65,91),absolute(65,91),clickCount=0] on frame0 505, java.awt.event.MouseEvent[MOUSE_EXITED,(65,92),absolute(65,92),button=0,clickCount=0] on frame0 

我的问题是 – 我怎样才能在这个单独的实体中访问

[MOUSE_RELEASED,(67,54),绝对(67,54),按钮= 1,改性剂= Button1的,的clickCount = 1]

没有解析出数据?

在我的情况下我需要全局事件监听器。 我以前从未使用过它们,所以我确信它是我忽略的东西。 相关问题(这一切都来自于此), Java检查鼠标按钮状态

只需检查e instanceof MouseEvent并从MouseEvent获取所有参数

 public void eventDispatched(AWTEvent e) { if (e instanceof MouseEvent) { MouseEvent me=(MouseEvent)e; } } long KEY_EVENTS = AWTEvent.KEY_EVENT_MASK; long MOUSE_EVENTS = AWTEvent.MOUSE_EVENT_MASK; long MOUSE_MOTION_EVENTS = AWTEvent.MOUSE_MOTION_EVENT_MASK; 

@StanislavL提供正确建议的代码

 import java.awt.*; import java.awt.event.*; import javax.swing.*; class ClosingFrame extends JFrame { private static final long serialVersionUID = 1L; private AWTEventListener awt; public ClosingFrame() { setName("Dialog ... ClosingFrame"); JButton b = new JButton("close dialog. 
enter this button from
" + "the top to get the
hoverhelp close enough
to cause problems"); b.setName("buttonToPress"); b.setToolTipText("111111111111111111111" + "1111111111111111111111111111111111111111111
"); b.addActionListener(closeActionListener); add(b); JPopupMenu menu = new JPopupMenu(); menu.add("some item ..........."); menu.add("another one .........."); b.setComponentPopupMenu(menu); pack(); setVisible(true); } private AWTEventListener createAWTWindowListener() { AWTEventListener awt1 = new AWTEventListener() { @Override public void eventDispatched(AWTEvent e) { if (MouseEvent.MOUSE_EXITED == e.getID()) { MouseEvent event = (MouseEvent) e; String name = event.getComponent().getName(); System.out.println("got mouseExited: " + name); awtMouseExited(event); } } }; return awt1; } private void awtMouseExited(MouseEvent event) { Point point = SwingUtilities.convertPoint(event.getComponent(), event.getPoint(), this); if (!getBounds().contains(point)) { // if (!getRootPane().getVisibleRect().contains(point)) { dispose(); } } private void installHoverListeners() { if (awt != null) { return; } awt = createAWTWindowListener(); Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); } private void uninstallHoverListeners() { if (awt == null) { return; } Toolkit.getDefaultToolkit().removeAWTEventListener(awt); awt = null; } @Override public void addNotify() { super.addNotify(); installHoverListeners(); } @Override public void removeNotify() { uninstallHoverListeners(); super.removeNotify(); } private ActionListener closeActionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { dispose(); } }; public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ClosingFrame closingFrame = new ClosingFrame(); } }); } }