前回、クリップボードを使用したコピー&ペーストを紹介しました。今回はその続きで、コピー&ペーストと同じように使用されるドラッグ&ドロップを取り上げます。ドラッグ&ドロップもクリップボードを利用するのですが、そこにドラッグのイベント処理が加わります。とはいうものの、Swingと比較するととても簡単に記述できるようになっています。

ドラッグボード

 コピー&ペーストはクリップボードを使用していましたが、ドラッグ&ドロップではドラッグボードを使用します。ドラッグボードはjavafx.scene.input.Dragboardクラスで表されます。

 とはいうものの、クリップボードと無関係ではありません。DragboardクラスはClipboardクラスのサブクラスで、ほとんどの機能はClipboardクラスで定義されています。コピー&ペーストと比べると、データを保持する側はほとんど変わりませんが、ドラッグとドロップに関するイベント処理が追加されます。

 ドラッグとドロップに関するイベント処理はjava.scene.Nodeクラスでプロパティとして定義されており、以下の6種類になります。

  • onDragDetected ドラッグの開始
  • onDragEntered ドロップ対象の領域への進入
  • onDragOver ドロップ対象の領域でのオーバ
  • onDragExited ドロップ対象の領域からの脱出
  • onDragDropped ドロップ
  • onDragDone ドラッグの終了

 これらの中でドラッグ&ドロップに必須なのが、onDragDetectedプロパティとonDragDroppedプロパティの2種類です。また、ドラッグ&ドロップでムーブを行う場合は、onDragDoneプロパティが必要になります。

 他の3種はドラッグ時に見た目を変化させるような用途に使用します。

 ここではonDragDetecedプロパティ、onDragDroppedプロパティ、onDragDoneプロパティに加えて、onDragOverプロパティを使用してみます。

サンプルプロジェクト(こちらでダウンロードできます)
DragNDropDemo.zip

 このサンプルはイメージが並んでおり、そのイメージをドラッグ&ドロップさせます。初期状態を図1に示しておきます。

図1●DragNDropDemo
図1●DragNDropDemo

 ドラッグするのはイメージで、ドロップの対象はイメージを子ノードとして保持するコンテナになります。