2010-03-18 34 views
8

Estoy seguro de que esto es posible, pero toda mi búsqueda está en blanco.Mover el mouse de Java en cualquier lugar de la pantalla

En Java, ¿es posible registrarse para un evento de movimiento del mouse fuera de una aplicación Java? Entonces, si el puntero del mouse se mueve a cualquier parte de la pantalla, recibo una llamada. Una aproximación es posible con el sondeo MouseInfo.getPointerInfo, pero debe haber una manera mejor.

Gracias

para explicar el caso de uso: Es sólo para un proyecto mascota, pero básicamente arranques cuando el ratón golpea el borde de la pantalla. También pensé que podrían dispararse diferentes eventos si intentas pasar el al borde de la pantalla. Y para esto, pensé que un oyente de movimiento de ratón podría ser más apropiado.

+0

No creo que haya una manera mejor. Esto debe ser independiente del sistema operativo y dudo que esto sea fácilmente posible. Pero, ¿qué ocurre si encuesta regularmente el método MouseInfo.getPointerInfo? ¿Cuál es tu uso? – Karussell

Respuesta

11

java.awt.event.MouseMotionListener solo le dará información sobre el movimiento del mouse dentro de la ventana de la aplicación. Para eventos que ocurren fuera de esa ventana, no hay forma de evitar el MouseInfo.getPointerInfo. Sin embargo, se podría escribir una clase (potencialmente Singleton) que las encuestas de la información de puntero en intervalos regulares y permite MouseMotionListeners que se añade:

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

Mira que hay algunas diferencias notables de su MouseMotionListener estándar sin embargo:

  • Solo recibirá mouseMoved eventos, nunca mouseDragged eventos. Esto se debe a que no hay forma de recibir información sobre los clics fuera de la ventana principal.
  • Por razones similares, el modifiers de cada MouseEvent será siempre 0.
  • Lo mismo ocurre con los valores clickCount, popupTrigger, button
  • Usted tendrá que proporcionar un maniquí java.awt.Component que será utilizado como el (falso) fuente de MouseEvent s - null Los valores no están permitidos aquí.
Cuestiones relacionadas