ページ

2013年4月14日日曜日

JavaFX - Dragging gestures (3)

今回は、Full press-drag-release gestureについてみていきたいと思います。

Simple press-drag-release gestureでは、ドラッグ中は、ドラッグしているノードにだけ、マウスイベントが発生し、ドラッグしているノード以外のノードでは、マウスイベントが発生しませんでした。ドラッグ中に、ドラッグしているノード以外で、マウスイベントが発生するようにするためには、Full press-drag-release gestureを利用する必要があります。

Full press-drag-release gestureを開始するためには、DRAG_DETECTEDイベントで、startFullDragメソッドを呼び出します。startFullDragメソッドを呼び出すと、ドラッグ中、マウスカーソルの下にあるノードに対して、MouseDragEventが発生しますので、このイベントにハンドラを追加して、ドラッグ中の処理を行います。

MouseDragEventのイベントタイプには、以下のものがあります。

  • MOUSE_DRAG_ENTERED
  • MOUSE_DRAG_ENTERED_TARGET
  • MOUSE_DRAG_EXITED
  • MOUSE_DRAG_EXITED_TARGET
  • MOUSE_DRAG_OVER
  • MOUSE_DRAG_RELEASED

MOUSE_DRAG_ENTERED_TARGETとMOUSE_DRAG_EXITED_TARGETについては、MouseEventのMOUSE_ENTERED_TARGETとMOUSE_EXITED_TARGETと同様で、対象となるノードの親ノードで、キャプチャリングフェーズあるいはバブリングフェーズで、対象となるノードのMOUSE_DRAG_ENTEREDやMOUSE_DRAG_EXITEDイベントに対して、ハンドラを追加したいときに利用します。

また、startFullDragメソッドを呼び出すだけでは、ドラッグしているノードにMouseDragEventが発生し、他のノードには発生しません。ドラッグしているノード以外のノードにMouseDragEventを発生させるためには、ドラッグしているノードに対して、mouseTransparentプロパティをtrueにして、マウスイベントを透過させる必要があります。基本的には、MOUSE_PRESSEDイベントで、mouseTransparentプロパティをtrueにし、MOUSE_RELEASEDイベントでfalseにして元に戻せばよいようです。このように設定することによって、ドラッグ中は、ドラッグしているノードにはMouseDragEventは発生せず、ドラッグしているノード以外のノードに対してMouseDragEventが発生します。

実際に、イベントがどのように発生するかを、以下にのようなデモでみてみます。

左のテキストエリアには、ドラッグしているノード(青色のCircle)で発生したMouseEventとMouseDragEventを表示し、右のテキストエリアには、ドラッグしているノード以外のノード(緑色のPane)で発生したMouseDragEventを表示しています。

Simpre press-drag-release gestureでは、ドラッグ対象のノードに対して、MouseEventが以下のように発生しています。

MOUSE_PRESSED
MOUSE_DRAGGED
MOUSE_DRAGGED
...
MOUSE_DRAGGED
DRAG_DETECTED
MOUSE_DRAGGED
...
MOUSE_DRAGGED
MOUSE_RELEASED

Full press-drag-release gestureでは、mouseTransparentをfalseのままの場合は、ドラッグ対象のノードに対して、MouseDragEventが以下のように発生しています。

MOUSE_PRESSED
MOUSE_DRAGGED
MOUSE_DRAGGED
...
MOUSE_DRAGGED
DRAG_DETECTED
MOUSE_DRAG_ENTERED
MOUSE_DRAGGED
MOUSE_DRAG_OVER
MOUSE_DRAGGED
MOUSE_DRAG_OVER
...
MOUSE_DRAGGED
MOUSE_DRAG_OVER
MOUSE_DRAG_RELEASED
MOUSE_RELEASED
MOUSE_DRAG_EXITED

ドラッグが終了したときのイベント発生順は、MOUSE_DRAG_RELEASED -> MOUSE_RELEASED -> MOUSE_DRAG_EXITEDの順になっているようですので、ドラッグ終了時の処理を行う場合は、この順に着目して行うとよさそうです。

Full press-drag-release gestureでmouseTranparentをtrueにした場合は、ドラッグ対象のノードに対しては、MouseDragEventは発生せず、ドラッグ対象のノード以外のノードに対して、MouseDragEventが以下のように発生しています。

MOUSE_DRAG_ENTERED
MOUSE_DRAG_OVER
MOUSE_DRAG_OVER
...
MOUSE_DRAG_OVER
MOUSE_DRAG_RELEASED
MOUSE_DRAG_EXITED

MOUSE_DRAG_RELEASEDイベントは、対象となるノード上でマウスをリリースしたときのみ発生しています。

以上で簡単ですが、MouseDragEventがどのように発生するかがわかりましたので、次回はFull press-drag-release gestureを利用したものを作成していきたいと思います。