使用AWTEventListener& amp;的全局事件监听器如何从中拉出MouseEvent

时间:2011-12-21 06:53:25

标签: java swing events listener awt

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

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

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 check mouse button state

2 个答案:

答案 0 :(得分:6)

只需检查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;

答案 1 :(得分:4)

@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("<html>close dialog.  <br>enter this button from <br>"
                + "the top to get the <br>hoverhelp close enough<br>to cause problems<html>");
        b.setName("buttonToPress");
        b.setToolTipText("<html>111111111111111111111"
                + "1111111111111111111111111111111111111111111<br></html>");
        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();
            }
        });
    }
}