10 Stimmen

Java-Mausbewegung an beliebiger Stelle auf dem Bildschirm

Ich bin sicher, dass dies möglich ist, aber meine Suche führt zu nichts.

Ist es in Java möglich, sich für ein Mausbewegungsereignis außerhalb einer Java-Anwendung zu registrieren? Wenn sich also der Mauszeiger irgendwo auf dem Bildschirm bewegt, erhalte ich einen Rückruf. Eine Annäherung ist mit Polling möglich MouseInfo.getPointerInfo aber es muss einen besseren Weg geben.

Danke

Um den Anwendungsfall zu erklären: Es ist nur für ein Pet-Projekt, aber im Grunde feuern Ereignisse, wenn die Maus den Rand des Bildschirms trifft. Ich habe auch gedacht, dass verschiedene Ereignisse abgefeuert werden könnten, wenn Sie versuchen sich vorbeidrängen den Rand des Bildschirms. Und dafür dachte ich, dass ein Mausbewegungshörer besser geeignet wäre.

13voto

Thomas Punkte 16651

java.awt.event.MouseMotionListener wird Ihnen nur Informationen über die Mausbewegung innerhalb Ihres Anwendungsfensters liefern. Für Ereignisse, die außerhalb dieses Fensters auftreten, gibt es keine Möglichkeit, die MouseInfo.getPointerInfo . Sie könnten jedoch eine (möglicherweise singleton) Klasse schreiben, die die Zeigerinformationen in regelmäßigen Abständen abfragt und es ermöglicht MouseMotionListeners hinzugefügt werden:

import java.awt.Component;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.HashSet;
import java.util.Set;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

/**
 * This class checks the position every #DELAY milliseconds and 
 * informs all registered MouseMotionListeners about position updates.
 */
public class MouseObserver {
    /* the resolution of the mouse motion */
    private static final int DELAY = 10;

    private Component component;
    private Timer timer;
    private Set<MouseMotionListener> mouseMotionListeners;

    protected MouseObserver(Component component) {
        if (component == null) {
            throw new IllegalArgumentException("Null component not allowed.");
        }

        this.component = component;

        /* poll mouse coordinates at the given rate */
        timer = new Timer(DELAY, new ActionListener() {
                private Point lastPoint = MouseInfo.getPointerInfo().getLocation();

                /* called every DELAY milliseconds to fetch the
                 * current mouse coordinates */
                public synchronized void actionPerformed(ActionEvent e) {
                    Point point = MouseInfo.getPointerInfo().getLocation();

                    if (!point.equals(lastPoint)) {
                        fireMouseMotionEvent(point);
                    }

                    lastPoint = point;
                }
            });
        mouseMotionListeners = new HashSet<MouseMotionListener>();
    }

    public Component getComponent() {
        return component;
    }

    public void start() {
        timer.start();
    }

    public void stop() {
        timer.stop();
    }

    public void addMouseMotionListener(MouseMotionListener listener) {
        synchronized (mouseMotionListeners) {
            mouseMotionListeners.add(listener);
        }
    }

    public void removeMouseMotionListener(MouseMotionListener listener) {
        synchronized (mouseMotionListeners) {
            mouseMotionListeners.remove(listener);
        }
    }

    protected void fireMouseMotionEvent(Point point) {
        synchronized (mouseMotionListeners) {
            for (final MouseMotionListener listener : mouseMotionListeners) {
                final MouseEvent event =
                    new MouseEvent(component, MouseEvent.MOUSE_MOVED, System.currentTimeMillis(),
                                   0, point.x, point.y, 0, false);

                SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            listener.mouseMoved(event);
                        }
                    });
            }
        }
    }

    /* Testing the ovserver */
    public static void main(String[] args) {
        JFrame main = new JFrame("dummy...");
        main.setSize(100,100);
        main.setVisible(true);

        MouseObserver mo = new MouseObserver(main);
        mo.addMouseMotionListener(new MouseMotionListener() {
                public void mouseMoved(MouseEvent e) {
                    System.out.println("mouse moved: " + e.getPoint());
                }

                public void mouseDragged(MouseEvent e) {
                    System.out.println("mouse dragged: " + e.getPoint());
                }
            });

        mo.start();
    }
}

Beachten Sie jedoch, dass es einige bemerkenswerte Unterschiede zu Ihrem Standard-MouseMotionListener gibt:

  • Sie erhalten nur mouseMoved Ereignisse, nie mouseDragged Veranstaltungen. Das liegt daran, dass es keine Möglichkeit gibt, Informationen über Klicks außerhalb des Hauptfensters zu erhalten.
  • Aus ähnlichen Gründen ist die modifiers eines jeden MouseEvent wird immer 0 sein.
  • Das Gleiche gilt für die Werte clickCount , popupTrigger , button
  • Sie müssen einen Dummy zur Verfügung stellen java.awt.Component die als (gefälschte) Quelle der MouseEvent s - null Werte sind hier nicht erlaubt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X