2014-02-17 46 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()); 
} 

還有很多工作要做...

相關問題