我可以倾听所有拖累;在java中删除事件?

时间:2014-02-17 09:02:17

标签: 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.getDefaultToolkit().addAWTEventListener(eventListener, mask);

但这不会导致丢弃事件,甚至在删除时也不会从鼠标中释放事件。 有没有办法拦截应用程序中的所有拖放事件,而不是分别在每个组件上?

1 个答案:

答案 0 :(得分:2)

这不是一个完整的(甚至可能不是一个可行的;-)解决方案,但可能会让你开始。

如上所述,在拖动过程中,dnd-subsystem会吞下所有低级输入事件(如mouseEvents,具体取决于底层操作系统)。在内部,它们被转换为DragXXEvents,而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());
}

还有很多工作要做......