2011-07-15 14 views
3

私のSWTベースのアプリケーションでは、「アイテム」の束を表示しているCanvas由来のカスタムウィジェットがあります。これらのアイテムの目的は、ユーザーがウィジェットからドラッグできるようにすることです。私はDragSource、DragDetectListener、およびDNDを動作させるためのすべてのものを実装するのに問題はありませんでした。私が解決しようとしている問題は、デフォルトのプラットフォームの動作よりもずっと短いマウスドラッグ距離の後で、ドラッグをずっと早く検出したいということです。SWTウィジェットのカスタムドラッグ検出

私はWidgetクラスのdragDetect()をオーバーライドできることを知っています。しかし、スーパークラスの実装を拒否することはできますが、スーパークラスがそれを持っていると思う前にドラッグがすでに発生したことを通知することはできません。

基本的には、自分でドラッグイベントを生成できる場合は、Widget.postEvent(SWT.DragDetect、eventWhichIAllocatedAndFilledOut)(パッケージプライベート)を使用すると、私のソリューションのように見えます。ウィジェットでドラッグ検出のコードを見てきましたが、このユースケースのために設計されていないようです。私が欲しいときはいつでもドラッグを開始することができますか?

答えて

3

私はそれを理解しました。カスタムイベントを生成し、それをDragDetectリスナーメカニズムに配布することは可能です。以下のコードは、内部の実装と同じようにしたが、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); 

ビルトインことは注目に値しますドラッグの検出を無効にして、意図したとおりに動作させる必要があります。デフォルトの実装は、mouseDown()ハンドラから呼び出すことができるdragDetect(MouseEvent e)メソッドを介して公開されています(dragDetect()のドキュメントを参照)。これは、ドラッグが検出されるまで、イベントスレッドでのビジーループによって機能します。 GTKバックエンドのネイティブイベントキューからマウス移動イベントを消費するだけです。 DragDetectListenerがウィジェットに登録されている場合、これは自動的に実行されるため、setDragDetect(false)を使用してメカニズムを無効にしない限り、イベントをブロックしているためにカスタム検出がビルトイン検出後にのみ実行されますスレッド、2回目のドラッグを検出する以外に、もちろんです。

関連する問題