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

时间:2011-01-07 08:09:57

标签: java event-handling click mouse listener

我想写一些对鼠标点击做出反应的代码。但似乎唯一的方法是听取Java组件的点击。直接聆听所有点击都会很棒。

是否有可能在Java中实现这一点?

提前致谢!

更新

发现,它需要通过JNI进行一些带有一些C编码的钩子。

更多信息 http://www.jotschi.de/?p=90

祝你好运, fnst

4 个答案:

答案 0 :(得分:2)

如果您愿意使用第三方库,那就完全有可能 - JNativeHook

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

答案 1 :(得分:1)

不要这么想,因为你正在运行沙箱。

答案 2 :(得分:0)

一些值得深思的东西:使用Java中的Point来检测点击发生的位置。 http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Point.html

不可否认,我以前只使用过一次来检测表格中的行,但它似乎最接近我发现的回答你的qn。:

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

对不起,如果这不是你想要的,但除此之外,点击组件是唯一的方法。什么是替代方案 - 点击容器?好吧,这没有任何意义吗?

答案 3 :(得分:0)

据我所知,没有简单的方法可以达到你想要的效果。但是你想要的是什么......对于完成这个任务的现代方式,我建议你检查一下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();

    }
}