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
이벤트가 수신됩니다. 주 창 외부의 클릭에 대한 정보를받을 수있는 방법이 없기 때문입니다. 각 MouseEvent
의 modifiers
항상 동일한 값 clickCount
, popupTrigger
간다 0
될 것이다 비슷한 이유로
, button
당신은으로 사용됩니다 더미
java.awt.Component
를 제공해야합니다
(가짜) 소스 MouseEvent
s - null
값은 허용되지 않습니다.
나는 더 좋은 방법이 있다고 생각하지 않습니다. 이는 OS 독립적이어야하며 쉽게 가능할 수 있을지는 의문입니다. 그러나 정기적으로 MouseInfo.getPointerInfo 메소드를 폴링하면 무엇이 잘못됩니까? 당신의 유스 케이스는 무엇입니까? – Karussell