Слушайте щелчки мышью по всей системе (не по JFrame и т. Д.) - PullRequest
4 голосов
/ 07 января 2011

Я хочу написать небольшой код, который реагирует на щелчок мышью. Но, похоже, единственный способ - слушать клики на компонентах Java. Неплохо было бы прослушивать все клики.

Есть ли возможность реализовать это на Java?

Заранее спасибо!

Обновление:

Выяснилось, что для этого потребуется перехват через JNI с некоторым C-кодированием.

Дополнительная информация о http://www.jotschi.de/?p=90

С уважением, fnst

Ответы [ 4 ]

2 голосов
/ 18 декабря 2013

Вполне возможно, если вы захотите использовать стороннюю библиотеку - JNativeHook

Она обеспечивает эти функциональные возможности с использованием JNI, что в чистом Java не возможноприложения.

1 голос
/ 07 января 2011

Не думаю, что из-за песочницы, в которой вы работаете.

0 голосов
/ 07 января 2011

Насколько я знаю, нет простого способа выполнить то, что вы хотите. Но то, что вы хотите, может быть сделано. Что ж, для современного способа решения этой задачи, я предлагаю вам изучить java.awt. Метод показа диалога.

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

    }
}
0 голосов
/ 07 января 2011

немного пищи для размышлений: используйте Point в Java, чтобы определить, где происходит щелчок. http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Point.html

по общему признанию, я использовал его только один раз для обнаружения строк в таблице, но это кажется самым близким к тому, что я нашел, отвечая на ваш вопрос:

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

Извините, если это не то, что вам нужно, но в остальном щелкнуть мышью по компонентам - это единственный путь. какая альтернатива - щелкнув по контейнерам? ну, это просто не имеет никакого смысла, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...