Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用AWTEventListener的全局事件侦听器&;如何拉动MouseEvent';这是因为_Java_Swing_Events_Listener_Awt - Fatal编程技术网

Java 使用AWTEventListener的全局事件侦听器&;如何拉动MouseEvent';这是因为

Java 使用AWTEventListener的全局事件侦听器&;如何拉动MouseEvent';这是因为,java,swing,events,listener,awt,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.getDefaultToo

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

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

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
我的问题是-我如何才能访问此数据库中的各个实体

[鼠标松开,(67,54),绝对(67,54),按钮=1,修改器=1,点击计数=1]

不分析数据


在我的情况下,我需要全局事件侦听器。我以前从未使用过它们,所以我肯定这是我忽略的东西。相关问题(这些都是从哪里产生的),

只需检查MouseEvent的e instanceof并从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("<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();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
类ClosingFrame扩展了JFrame{
私有静态最终长serialVersionUID=1L;
私人AWTEventListener awt;
公共关闭框架(){
setName(“对话框…关闭框架”);
JButton b=新JButton(“关闭对话框。

输入此按钮” +“使
鼠标悬停帮助靠近足以引起问题的顶部”); b、 设置名称(“按钮按下”); b、 setToolTipText(“111111111111111” +“1111111111111111111111111111111111111111
”; b、 addActionListener(closeActionListener); 添加(b); JPopupMenu=newjpopupmenu(); 菜单。添加(“某些项目…………”; 菜单。添加(“另一个……”); b、 setComponentPopupMenu(菜单); 包装(); setVisible(真); } 专用AWTEventListener createAWTWindowListener(){ AWTEventListener awt1=新的AWTEventListener(){ @凌驾 已调度公共无效事件(AWTEvent e){ if(MouseEvent.MOUSE_EXITED==e.getID()){ MouseEvent事件=(MouseEvent)e; 字符串名称=event.getComponent().getName(); System.out.println(“got mouseexitted:+name”); AWTMouseExit(事件); } } }; 返回awt1; } 私有void awtMouseExited(MouseEvent事件){ Point Point=SwingUtilities.convertPoint(event.getComponent(),event.getPoint(),this); 如果(!getBounds().包含(点)){ //如果(!getRootPane().getVisibleRect()包含(点)){ 处置(); } } 私有void installHoverListeners(){ 如果(awt!=null){ 返回; } awt=createAWTWindowListener(); Toolkit.getDefaultToolkit().addAWTEventListener(awt,AWTEvent.MOUSE\u EVENT\u MASK); } 私有void监听器(){ 如果(awt==null){ 返回; } getDefaultToolkit().removeAWTEventListener(awt); awt=null; } @凌驾 public void addNotify(){ super.addNotify(); installHoverListeners(); } @凌驾 公共无效删除通知(){ 卸载hoverlisteners(); super.removeNotify(); } 私有ActionListener closeActionListener=新ActionListener(){ @凌驾 已执行的公共无效操作(ActionEvent ActionEvent){ 处置(); } }; 公共静态void main(字符串参数[]){ SwingUtilities.invokeLater(新的Runnable(){ @凌驾 公开募捐{ ClosingFrame ClosingFrame=新ClosingFrame(); } }); } }
当我尝试此操作时,它抛出错误:不兼容的条件操作数类型AWTEvent和MouseEvent(在第2行)谢谢你激发了mKorbel的答案。这个答案和那个答案的结合解决了我的问题。希望我能接受两个答案!@Trevorsior应该完全按照Stan所示的那样工作-如果你需要混入任何东西,那么在你的上下文中还有一些错误需要你注意:-)目前正在我的代码中实现它。我已经学会了我不想从这里得到其他东西-谢谢!