遅いと悪名高いSwingにもドラッグアンドドロップのサポートがあるらしい。(AWTの時代から)
JDK1.4の頃に、新しいドラッグアンドドロップのサポートが追加されたとな!
TextFieldとかにはdragEnabledというプロパティが出来てて、それをtrueに設定するだけでドラッグをサポートするようになる。↓みたいな感じ
たったこれだけで、上のテキストフィールドでテキストを選択状態にしてドラッグすると、下のテキストフィールドにドロップできるようになっちゃう。
ちなみに、ドロップされたものの処理はドロップされたコンポーネントのtransferHandlerプロパティに設定されたものが面倒を見る事になってる。
なので、下のTextFieldのtransferHandlerをnullにすると、ドロップが出来なくなる。
この挙動だけを見てると、TransferHandlerっていうのがキモっぽい気がしてきた!!
ってことで見て見る。
javax.swing.TransferHandlerクラスには、コンストラクタが2個ある。
protected TransferHandler() |
継承先用 |
public TransferHandler(String property) |
プロパティの値を転送する |
プロパティの値を転送するのは面倒みる。
それ以外は自作しろってポリシーちっく。
ってことで、普通はドラッグをサポートしてないJLabelに機能を追加してみた。
textプロパティを転送してもらうようにセット!
これで、何もかもうまくいきそうな感じだけど、そうもいかない。実行してみたけどうんともすんとも言わない。
どうやら、いつドラッグ開始されたよ!っていうのを教えてあげないといけない。
世話の焼けるやつだ。
ラベルの、mousePressedイベントでドラッグ開始の合図をtransferHandlerにしてやる。
private void jLabel1MousePressed(java.awt.event.MouseEvent evt) {
jLabel1.getTransferHandler().exportAsDrag(jLabel1, evt, TransferHandler.COPY);
}
こうすると、ラベルでドラッグできるようになる。
実際にラベルからテキストフィールドにドラッグアンドドロップしてみるとテキストプロパティの値が伝わってる。
TransferHandlerを拡張すれば、自分で色々痒い所までカスタマイズができるっぽい。
でも時間切れ。