2010-03-18 5 views
8

Ich bin mir sicher, dass dies möglich ist, aber alle meine Suche ist leer.Java Maus Bewegung irgendwo auf dem Bildschirm

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

Dank

den Anwendungsfall zu erklären: Es ist nur für ein Projekt Haustier aber im Grunde Ereignisse feuern, wenn die Maus den Bildschirmrand trifft. Ich dachte auch, dass verschiedene Ereignisse ausgelöst werden könnten, wenn Sie versuchen, Push den Rand des Bildschirms. Und dafür dachte ich, ein Maus-Motion-Listener wäre besser geeignet.

+0

Ich glaube nicht, dass es einen besseren Weg gibt. Dies muss OS-unabhängig sein und ich bezweifle, dass dies leicht möglich ist. Aber was ist falsch, wenn Sie regelmäßig die MouseInfo.getPointerInfo-Methode abfragen? Was ist dein Anwendungsfall? – Karussell

Antwort

11

java.awt.event.MouseMotionListener wird nur Informationen über die Mausbewegung in Ihrem Anwendungsfenster geben. Für Ereignisse außerhalb dieses Fensters gibt es keinen Weg um MouseInfo.getPointerInfo. Sie können jedoch eine (möglicherweise Singleton) Klasse, die Umfragen der Zeiger Informationen in regelmäßigen Abständen schreiben und MouseMotionListeners hinzugefügt werden können:

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, dass es einige bemerkenswerte Unterschiede von Ihrem Standard Mouse sind aber:

  • Sie erhalten nur mouseMoved Ereignisse, niemals mouseDragged Ereignisse. Der Grund dafür ist, dass es keine Möglichkeit gibt, Informationen zu Klicks außerhalb des Hauptfensters zu erhalten.
  • Aus ähnlichen Gründen die modifiers jedes MouseEvent immer 0.
  • Das gleiche gilt für die Werte clickCount, popupTrigger, button
  • Sie eine Dummy-java.awt.Component angeben müssen geht sein werden, wie die verwendet werden (Fälschung) Quelle der MouseEvent s - null Werte sind hier nicht erlaubt.