2010-03-18 40 views
8

Tôi chắc chắn điều này là có thể nhưng tất cả tìm kiếm của tôi sắp hết trống.Chuyển động chuột Java ở bất kỳ đâu trên màn hình

Trong Java, bạn có thể đăng ký sự kiện chuyển động chuột bên ngoài ứng dụng Java không? Vì vậy, nếu con trỏ chuột di chuyển đến bất cứ nơi nào trên màn hình, tôi sẽ nhận lại cuộc gọi. Một phép tính xấp xỉ là có thể với việc bỏ phiếu MouseInfo.getPointerInfo nhưng phải có cách tốt hơn.

Cảm ơn

Để giải thích các trường hợp sử dụng: Nó chỉ cho một dự án thú cưng nhưng về cơ bản bắn các sự kiện khi chuột nhấp vào cạnh của màn hình. Tôi cũng nghĩ rằng các sự kiện khác nhau có thể bị sa thải nếu bạn cố gắng đẩy qua cạnh của màn hình. Và cho điều này tôi nghĩ một người nghe chuyển động chuột có thể thích hợp hơn.

+0

Tôi không nghĩ rằng có cách nào tốt hơn. Điều này phải được hệ điều hành độc lập và tôi nghi ngờ rằng điều này là dễ dàng có thể. Nhưng điều gì là sai nếu bạn thăm dò ý kiến ​​thường xuyên phương pháp MouseInfo.getPointerInfo? Usecase của bạn là gì? – Karussell

Trả lời

11

java.awt.event.MouseMotionListener sẽ chỉ cung cấp cho bạn thông tin về di chuyển chuột trong cửa sổ ứng dụng của bạn. Đối với các sự kiện xảy ra bên ngoài cửa sổ đó, không có cách nào xung quanh MouseInfo.getPointerInfo. Tuy nhiên, bạn có thể viết một (có khả năng singleton) lớp mà các cuộc thăm dò các thông tin con trỏ trong chu kỳ bình thường và cho phép MouseMotionListeners được thêm vào:

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

Cẩn thận rằng có một số khác biệt đáng chú ý từ MouseMotionListener tiêu chuẩn của bạn mặc dù:

  • Bạn sẽ chỉ nhận được mouseMoved sự kiện, không bao giờ mouseDragged sự kiện. Đó là bởi vì không có cách nào để nhận thông tin về các nhấp chuột bên ngoài cửa sổ chính.
  • Vì lý do tương tự, modifiers của mỗi MouseEvent sẽ luôn luôn là 0.
  • Cũng vậy với các giá trị clickCount, popupTrigger, button
  • Bạn sẽ cần phải cung cấp một hình nộm java.awt.Component sẽ được sử dụng như là (giả) nguồn của các giá trị MouseEvent s - null không được phép ở đây.
Các vấn đề liên quan