2010-03-18 4 views
8

이것이 가능하지만 모든 검색이 공백이 될 것이라고 확신합니다.화면 어디에서나 Java 마우스 동작

자바에서는 Java 응용 프로그램 외부에서 마우스 동작 이벤트를 등록 할 수 있습니까? 따라서 마우스 포인터가 화면의 아무 곳이나 움직이면 콜백을 받게됩니다. 폴링 MouseInfo.getPointerInfo으로 근사값을 구할 수 있지만 더 좋은 방법이 있어야합니다.

감사

은 사용 사례를 설명하기 : 그냥 애완 동물 프로젝트하지만 마우스가 화면의 가장자리를 칠 때 기본적으로 이벤트를 발사합니다. 나는 또한 을 시도하면 화면의 가장자리 인을 밀어 다른 이벤트가 발생할 수 있다고 생각했습니다. 그리고 이것을 위해 마우스 모션 리스너가 더 적절하다고 생각했습니다.

+0

나는 더 좋은 방법이 있다고 생각하지 않습니다. 이는 OS 독립적이어야하며 쉽게 가능할 수 있을지는 의문입니다. 그러나 정기적으로 MouseInfo.getPointerInfo 메소드를 폴링하면 무엇이 잘못됩니까? 당신의 유스 케이스는 무엇입니까? – Karussell

답변

11

java.awt.event.MouseMotionListener은 응용 프로그램 창 내에서 마우스 이동에 대한 정보 만 제공합니다. 창 밖에서 발생하는 이벤트의 경우 MouseInfo.getPointerInfo 주위에는 아무런 방법이 없습니다.

    :

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

    하지만 표준 모든 MouseMotionListener에서 주목할만한 차이가 있음을주의 : 그러나, 당신은 MouseMotionListeners를 추가 할 수 있습니다 여론 조사 일정한 간격의 포인터 정보와 (잠재적 싱글) 클래스를 쓸 수

  • mouseMoved 이벤트 만받을 수 있으며 절대로 mouseDragged 이벤트가 수신됩니다. 주 창 외부의 클릭에 대한 정보를받을 수있는 방법이 없기 때문입니다. 각 MouseEventmodifiers 항상 동일한 값 clickCount, popupTrigger 간다 0
  • 될 것이다 비슷한 이유로
  • , button
  • 당신은으로 사용됩니다 더미 java.awt.Component를 제공해야합니다
  • (가짜) 소스 MouseEvent s - null 값은 허용되지 않습니다.