我试图在 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()

10-08 12:33