2014-02-17 20 views
5

我想倾听Swing上的所有拖放事件。我设法监听拖动事件我可以在Java中监听所有拖放事件吗?

一个办法是通过添加:

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); 

,但这并没有得到掉落的事件,甚至没有从鼠标下降时释放事件。 有没有办法拦截应用程序中的所有拖放事件,而不是分别在每个组件上?

+0

我想记录用户所做的所有事情,提取方案,然后在这些方案中创建自动化测试。 –

+0

雄心勃勃:-)全局监听器是非常低级的,所以你会得到原始的鼠标/动作事件,但很可能没有像dragEvent/dropEvent这样的更高级的事件。虽然从未尝试过。顺便说一下,mouseMotion!=鼠标,以获得释放/按下移动/拖动,你将不得不添加后者掩码以及 – kleopatra

+1

我错过了在问题中添加,因为我希望它尽可能简洁和简洁。我修改了这个问题中的面具,因为我现在正在使用它,但即使如此,发布事件也没有被捕获,所以我认为它是由drop事件消耗的。 –

回答

2

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

如上所述,在拖动过程中,dnd子系统会吞下所有低级输入事件(如mouseEvent,这取决于底层操作系统,也可能有其他操作系统)。在内部,它们被转换成DragXXEvent,而DragXXEvent又被DragSource触发。 dragSource是一个在所有dnd操作中重用的单例。所以很长的路要走可能是:

  • 抢了全球的DragSource
  • 注册一个DragSource /运动/监听
  • 监视来自的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()); 
} 

还有很多工作要做...