Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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 聆听鼠标在整个系统上的点击(而不是在JFrame等上)_Java_Event Handling_Click_Mouse_Listener - Fatal编程技术网

Java 聆听鼠标在整个系统上的点击(而不是在JFrame等上)

Java 聆听鼠标在整个系统上的点击(而不是在JFrame等上),java,event-handling,click,mouse,listener,Java,Event Handling,Click,Mouse,Listener,我想写一个对鼠标点击做出反应的小代码。但似乎唯一的方法是倾听Java组件上的点击。一个直接收听所有点击的人会很好 实际上有可能在Java中实现这一点吗 提前谢谢 更新: 发现它需要一个通过JNI的钩子和一些C代码 更多有关 致以最良好的祝愿, fnst不要这样认为,因为您正在运行的沙箱。一些值得思考的问题:使用Java中的Point来检测单击发生的位置 诚然,我以前只使用过一次它来检测表中的行,但它似乎最接近我发现的回答问题的方法 public void mouseClicked(MouseE

我想写一个对鼠标点击做出反应的小代码。但似乎唯一的方法是倾听Java组件上的点击。一个直接收听所有点击的人会很好

实际上有可能在Java中实现这一点吗

提前谢谢

更新:

发现它需要一个通过JNI的钩子和一些C代码

更多有关

致以最良好的祝愿,
fnst

不要这样认为,因为您正在运行的沙箱。

一些值得思考的问题:使用Java中的Point来检测单击发生的位置

诚然,我以前只使用过一次它来检测表中的行,但它似乎最接近我发现的回答问题的方法

public void mouseClicked(MouseEvent e) {
    JTable target = (JTable)e.getSource();
    //get the coordinates of the mouse click
    Point p = e.getPoint();
    //get the row index that contains that coordinate
    row= target.rowAtPoint(p);
}

我很抱歉,如果这不是你要找的,但除此之外,点击组件是唯一的方法。还有什么选择——点击容器?好吧,那没有任何意义,是吗?

据我所知,要想实现你的愿望,没有简单的方法。但是你想要的是可以做到的。。为了实现这个任务,我建议您检查java.awt.Dialog-show方法

package mouseclickevent;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.MenuComponent;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.awt.event.MouseEvent;
import java.lang.reflect.Method;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class FrmEvent extends JFrame {
    public FrmEvent(){
        JPanel panel = new JPanel();
        getContentPane().add(panel);
        JButton btn = new JButton("Test");
        panel.add(btn);
        panel.add(new JTextField("Test"));
        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                FrmEvent frm = new FrmEvent();
                frm.setBounds(300,300,  200, 200);
                frm.show();

            }
        });

    }

    private void consumeEvents() {
        try {
            if (Thread.currentThread().getClass().getName().endsWith(
            "EventDispatchThread")) {
                EventQueue eq = null;
                eq = Toolkit.getDefaultToolkit().getSystemEventQueue();

                if (eq == null) {
                    return;
                }
                while (isVisible() || isShowing()) {
                    AWTEvent event = eq.getNextEvent();
                    Object src = event.getSource();
                    Class kActiveEvent= Class.forName("java.awt.ActiveEvent");
                    if (kActiveEvent != null) {
                        if (kActiveEvent.isInstance(event)) {
                            Method m;
                            Class types[] = {};
                            Object args[] = {};
                            m = kActiveEvent.getMethod("dispatch",  types);

                            if (m != null) {
                                m.invoke(event, args);
                                continue;
                            }
                        }
                    }
                    dispatchEvent(src, event);
                }
            }

        }
        catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    private  void dispatchEvent(Object src, AWTEvent event) {
        if (event.getID()== MouseEvent.MOUSE_CLICKED) {
            System.out.println("mouseClicked");
        }
        if (src instanceof Component) {
            ( (Component) src).dispatchEvent(event);
        } else if (src instanceof MenuComponent) {
            ( (MenuComponent) src).dispatchEvent(event);
        }
    }

    public void show(){
        super.show();
        consumeEvents();
    }

    public static void main(String[] args) {

        FrmEvent frm = new FrmEvent();
        frm.setBounds(300,300,  200, 200);
        frm.show();

    }
}

如果您愿意使用第三方库,


它使用JNI提供这些功能,而这在纯java应用程序中是不可能的。

Perfect,你救了我一天。