我能听一听所有的拖拽声吗;在java中删除事件?

我能听一听所有的拖拽声吗;在java中删除事件?,java,swing,drag-and-drop,awt,Java,Swing,Drag And Drop,Awt,我想听听Swing上的所有拖放事件 我设法监听拖动事件的一种方法是添加: final long mask = AWTEvent.MOUSE_EVENT_MASK + AWTEvent.MOUSE_MOTION_EVENT_MASK; AWTEventListener eventListener = new AWTEventListener() { public void eventDispatched(final AWTEvent event) {} }; Toolkit.getDef

我想听听Swing上的所有拖放事件

我设法监听拖动事件的一种方法是添加:

final long mask = AWTEvent.MOUSE_EVENT_MASK + AWTEvent.MOUSE_MOTION_EVENT_MASK;

AWTEventListener eventListener = new AWTEventListener() {
    public void eventDispatched(final AWTEvent event) {}
};
Toolkit.getDefaultToolkit().addAWTEventListener(eventListener, mask);
但这不会获取拖放事件,甚至不会在拖放时从鼠标释放事件。 是否有一种方法可以截取应用程序中的所有拖放事件,而不是单独截取每个组件上的所有拖放事件

对于您的需求,这不是一个完整的(甚至可能不是一个可行的;-)解决方案,但可能会让您开始

如前所述,所有低级输入事件(如mouseEvents,取决于底层操作系统,可能还有其他事件)在拖动过程中都会被dnd子系统吞并。在内部,它们被转换为DragXXEvents,然后由DragSource触发。dragSource是一个可在所有dnd操作中重复使用的单例。因此,一个可行的方法可能是:

  • 抓住全局DragSource
  • 注册一个DragSource/Motion/Listener
  • 根据需要监视DragSourceEvent中的信息
一些片段:

DragSource source = DragSource.getDefaultDragSource();
DragSourceMotionListener dsml = new DragSourceMotionListener() {

    @Override
    public void dragMouseMoved(DragSourceDragEvent dsde) {
        debug(dsde);
    }
};
source.addDragSourceMotionListener(dsml);

// just some logging
protected void debug(DragSourceEvent dsde) {
    DragSourceContext context = dsde.getDragSourceContext();
    Component source = context.getComponent();
    String text = source != null ? source.getName() : "none";
    LOG.info(text + " x/y " + dsde.getX() + "/" + dsde.getY());
}

还有很多工作要做…

我想记录用户所做的一切,提取场景,然后在这些场景上创建自动测试。雄心勃勃:-)全局侦听器的级别非常低,因此您将获得原始鼠标/运动事件,但很可能不会得到任何更高级别的事件,如DrageEvent/dropEvent。但从未尝试过。顺便说一句,mouseMotion!=鼠标,要使释放/按下和移动/拖动同时进行,您还必须添加后一个掩码。我没有在问题中添加该掩码,因为我希望它尽可能简短。我修改了问题中的掩码,因为我目前正在使用它,但即使如此,发布事件也没有被捕获,所以我认为它被drop事件消耗了。是的,刚刚检查:所有dropXXEvents都不是AWTEvents,因此AWTEventListner无法访问。在拖动操作中,系统会吞噬所有鼠标事件。有趣的问题!事实上,d&d事件并没有扩展到AWTEvent,这让我怀疑从一开始就拦截它们的可能性。我希望java.awt.dnd或java.awt.dnd.peer包中缺少某种全局侦听器。无论如何,我认为我想要的一种方法是通过一个util类安装所有拖拽支持,该类接收一个封装在日志装饰器中的委托,但我认为这太过分了。