我试图在 World Wind 中通过鼠标单击禁用地球的移动。我希望能够做到:
void disableGlobeDrag(WorldWindowGLCanvas ww) {
ww.addMouseMotionListener(new MyMouseMotionListener());
}
其中
MyMouseMotionListener
消耗所有鼠标事件。这不起作用,所以我必须这样做:void disableGlobeDrag(WorldWindowGLCanvas ww) {
for(MouseMotionListener l : ww.getMouseMotionListeners()) {
if(l.getClass().toString().equals("class gov.nasa.worldwind.awt.AWTInputHandler")) {
ww.removeMouseMotionListener(l);
}
}
}
是否预期消耗的鼠标事件仍应到达
gov.nasa.worldwind.awt.AWTInputHandler
监听器?更新:
WorldWindowGLCanvas
只是在 addMouseMotionListener()
上调用 java.awt.Component
所以显然我不明白消费事件是如何工作的。更新 2: 尽管与 Swing 共享接口(interface),但以
WorldWindowGLCanvas.removeMouseMotionListener()
作为参数调用 AWTInputHandler
将阻止所有其他 MouseMotionListener
接收事件。应该改用 AWTInputHandler
上的 add 和 remove 方法。 最佳答案
不幸的是,按照@trashgod 的建议删除 MouseMotionListener
不起作用,因为发生了一些 World Wind 特定行为:删除 gov.nasa.worldwind.awt.AWTInputHandler
会导致其他 MouseMotionListener
停止接收事件通知。
要禁用地球拖动并仍然在另一个 MouseMotionListener
中接收事件,需要执行以下步骤:
引用 World Wind 的 AWTInputHandler
:
AWTInputHandler wwHandler = null;
// get World Wind's AWTInputHandler class:
for (MouseMotionListener l : ww.getMouseMotionListeners()) {
if(l instanceof AWTInputHandler) {
wwHandler = (AWTInputHandler)l;
break;
}
}
创建一个消耗事件的
MouseMotionListener
:public class MyMouseMotionListener implements MouseMotionListener {
@Override
public void mouseDragged(MouseEvent e) {
// consume the event so the globe position does not change
e.consume();
if (e.getSource() instanceof WorldWindowGLCanvas) {
// get the position of the mouse
final WorldWindowGLCanvas canvas = ((WorldWindowGLCanvas) e.getSource());
final Position p = canvas.getCurrentPosition();
// do something with the position here
}
}
@Override
public void mouseMoved(MouseEvent e) {
e.consume();
}
}
将鼠标运动监听器添加到
AWTInputHandler
: if(wwHandler != null) {
wwHandler.addMouseMotionListener(new MyMouseMotionListener());
} else {
// I don't think this should happen unless the AWTInputHandler
// is explicitly removed by client code
logger.error("Couldn't find AWTInputHandler");
}
也就是说,我不知道为什么
WorldWindowGLCanvas
使用 Component.addMouseMotionListener()
而不是 AWTInputHandler.addMouseMotionListener()
。