日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

JavaFX の Drag and Drop

JavaFX に限らず、一言に Drag and Drop と言っても、Source と Target が何か、Target の扱いを どうするかで話は大分変わるんじゃないかなと思いつつ、まずは日本語リソースをググってみるがサッとは見当たらない。 この記事の続き には書かれてるかもしれないが会員登録してないし登録フォームみたら凄まじく入力項目が多かった のでめんどくさくなり今回もまた公式チュートリアルを翻訳しながら試す事にした。

今回の翻訳元は以下。

Drag-and-Drop Feature in JavaFX Applications | JavaFX 2 Tutorials and Documentation

JavaFX 8 になっても Drag and Drop に関してはあまり変わってないんじゃないかと。試してないけど (と言うか試せないんだけど)

しかしあれだな、Java8 になって基本ドキュメントの体裁も Java8 に合わせた形になってるけど今 回の元記事みたいに 2.x の時の記事が残ってる部分もちらほらあるな。つか公式日本語翻訳はまだ ですかね。

JavaFX での Drag and Drop 機能について(Drag-and-Drop Feature in JavaFX Applications)

この記事では JavaFX 2 での drag and drop(以下 DnD) 実装方法について学びます。 より具体的には以下のような項目についてサンプルコードを交えながら学んでいきます。

  • 追従するオブジェクトは何か
  • 転送可能なのかデータは何か
  • 発生するイベントは何か

はじめに(Introduction)

DnD 操作とは何でしょうか。これは Drag 元(gesture source)と Drop 先(gesture target)の 2 つ のオブジェクト間でデータを転送する事です。

Drag 元や Drop 先になり得るオブジェクトとしては

  • Nodes
  • Scenes

などがあります。

また、別 JavaFX アプリや Java クライアントアプリ間の DnD も有り得ます。もっと言えば JavaFX アプリや Windows エクスプローラなどのネイティブアプリ間での DnD も考えられます。

さて、DnD 操作中は以下の事が起こります。

  • ユーザが Drag 元(gesture source)をマウスクリック
  • マウスドラッグ
  • Drop 先(gesture target)へマウスを離す
  • Drag 中は、その先へは Drop 可能・不可能だとかどこへ Drop すべきなのかなどが ユーザに分かるようなビジュアルを出す

DnD するデータは dragboard と呼ばれるものを通じて転送されます。dragboard は clipboard のイ ンターフェースと同じですが、DnD のデータ転送のみに使われます。DnD 操作ではテキストだったり 画像だったりその他ファイルだったり、単にバイト配列や文字列であるなど様々なデータが転送されます。

javafx.scene.input.DragEvent クラスは DnD 操作を実現するのに使われる基本的なクラスです。 より詳細な情報は API doc の javafx.scene.input パッケージの項目を参照下さい。

転送モード(Transfer Modes)

転送モードは Drag 元と Drop 先の間でどのような操作とするかを定義します。 利用可能な転送モードは COPY, MOVE, LINK の 3 つです。Drag 元はサポートされている転送モードをレポートします。 Drop 先は 1 つ以上の転送モードを受け付けます。

DnD 中での転送モードは以下要素の組み合わせで選ばれます。

  • drag 元転送モード
  • drop 先転送モード
  • ユーザのキーボード操作

基本的な DnD 操作の実装(Implementing a Basic Drag-and-Drop Gesture)

ここ以降は翻訳しない。 手前味噌だけど Scene Builder + cljfx + Clojure で書いてみる。

元の Java ソースはこちら。

http://docs.oracle.com/javafx/2/drag_drop/HelloDragAndDrop.java.html

んで Scene Builder + cljfx 0.1.6 + Clojure 移植版。

https://github.com/shinmuro/cljfx/blob/master/test/cljfx/examples/dnd.clj

今回は久々にリビジョンアップした Github のソースツリーのリンクなので埋め込みは無し。 Github for Windowsがあまりにもお手軽なのでこれなら利用を継続する気にまたなった。

ライブラリの中身大分変わったけどすんません。

お試しアプリを作りながら自分がライブラリに必要かなと思ったのを順次追加してるような流れなのでライブラリとしてある程度固まるのは正直いつになるか分かりません。