2011-07-15 114 views
3

在我的基於SWT的應用程序中,我有一個Canvas派生的自定義小部件,它顯示了一堆「項目」。這些項目的全部目的是讓用戶將它們拖出小部件。我沒有執行DragSource,DragDetectListener和所有這些東西來讓DND工作。我試圖解決的問題是我想要更早地檢測拖拽,即在比默認平臺行爲短得多的鼠標拖拽距離之後。SWT小部件中的自定義拖動檢測

我知道我可以覆蓋Widget類的dragDetect()。但是,這隻允許我否決超級類的實現,而不是通知在超級類認爲它已經發生之前已經發生了拖動。

基本上,如果我可以自己生成拖動事件,就像我可以使用Widget.postEvent(SWT.DragDetect,eventWhichIAllocatedAndFilledOut)(它是私有包)一樣,那看起來就像我的解決方案。我已經查看了Widget中拖動檢測的代碼,並且它似乎並未針對此用例進行設計。有沒有什麼工作讓我隨時啓動拖動?

回答

3

我已經想通了。可以生成自定義事件並將其分發到DragDetect偵聽器機制。下面的代碼不一樣的內部實現,但可以隨意從widget實現中調用,例如從MouseMoveListener的MouseMove(的MouseEvent E)掛鉤:

Event event = new Event(); 
event.type = SWT.DragDetect; 
event.display = getDisplay(); 
event.widget = this; 
event.button = e.button; 
event.stateMask = e.stateMask; 
event.time = e.time; 
event.x = e.x; 
event.y = e.y; 

notifyListeners(SWT.DragDetect, event); 

值得注意的是,內置的必須禁用拖動檢測才能按預期工作。通過dragDetect(MouseEvent e)方法可以從mouseDown()處理程序調用默認實現(如dragDetect()的文檔中所述)。它通過在事件線程中繁忙循環直到檢測到拖動來工作。它至少會從GTK後端的本機事件隊列中消耗鼠標移動事件。當一個DragDetectListener向Widget註冊時,這將自動完成,所以除非通過setDragDetect(false)禁用機制,否則自定義拖動檢測只會在內置檢測之後運行,因爲它會阻塞事件線程,當然還有第二次檢測阻力。