Global Event Listeners with AWTEventListener & how to pull MouseEvent's from it

妖精的绣舞 提交于 2019-11-27 18:49:47

问题


The following question is based on the following information. Scroll down to see the actual question - it refers to the console output specifically.

I have stripped out everything, and provided a simple program to reproduce the output below:

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);
    }
}

You will see that it gives the following output in the console:

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

My question is - how can I get access to in individual entities in this

[MOUSE_RELEASED,(67,54),absolute(67,54),button=1,modifiers=Button1,clickCount=1]

without parsing out the data?

I need global event listeners in my situation. I've never used them before so I'm sure it's something I'm overlooking. Related question (where this all spawned from), Java check mouse button state


回答1:


Just check e instanceof MouseEvent and get all the parameters from the 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;



回答2:


code for correct suggestion by @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();
            }
        });
    }
}


来源:https://stackoverflow.com/questions/8586098/global-event-listeners-with-awteventlistener-how-to-pull-mouseevents-from-it

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!