前回、クリップボードを使用したコピー&ペーストを紹介しました。今回はその続きで、コピー&ペーストと同じように使用されるドラッグ&ドロップを取り上げます。ドラッグ&ドロップもクリップボードを利用するのですが、そこにドラッグのイベント処理が加わります。とはいうものの、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に示しておきます。

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