ドラッグアンドドロップのサンプル 1.ドロップを受け取るだけのサンプル(文字列、ファイル)
ドラッグアンドドロップの入り口として、ドロップを受け取るだけのサンプルを書いてみました。
エクスプローラからファイルをドロップしたい!なんて場合も、この簡単なサンプルだけで十分です。
ポイント
- ドロップイベントを受け取るには「DropTargetListener.drop」を実装します。
- 「DropTargetListener」は「DropTarget」に設定します。
- new DropTarget(コンポーネント, リスナー);を実行すると、DropTargetの内部でaddDropTargetListenerされます。
- ドロップすると1.で実装した「drop」が実行されます。
- 「DropTargetDropEvent.acceptDrop」でドロップを受け取る準備をします。
- 「DropTargetDropEvent.isDataFlavorSupported」で、受け取り可能なフレーバーを調べます。
- 標準では文字列用の「stringFlavor」、ファイル用の「javaFileListFlavor」、画像イメージ用の「imageFlavor」があります。
- 「DropTargetDropEvent.getTransferable」で転送クラスを取得します。
- 「Transferable.getTransferData」でドロップされたオブジェクトを受け取ります。
- ファイルは「List<File>」にキャストして操作するとよいです。
- 「DropTargetDropEvent.dropComplete」で転送完了を通知して終了です。
実行結果
テキストドロップ
エクスプローラからファイルドロップ
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
/*
* ドラッグアンドドロップのサンプル 1.ドロップを受け取るだけのサンプル(文字列、ファイル)
* ポイント1.ドロップイベントを受け取るには「DropTargetListener.drop」を実装します。
* ポイント2.「DropTargetListener」は「DropTarget」に設定します。
* new DropTarget(コンポーネント, リスナー);を実行すると、DropTargetの内部でaddDropTargetListenerされます。
* ポイント3.ドロップすると1.で実装した「drop」が実行されます。
* 「DropTargetDropEvent.acceptDrop」でドロップを受け取る準備をします。
* 「DropTargetDropEvent.isDataFlavorSupported」で、受け取り可能なフレーバーを調べます。
* 標準では文字列用の「stringFlavor」、ファイル用の「javaFileListFlavor」、画像イメージ用の「imageFlavor」があります。
* 「DropTargetDropEvent.getTransferable」で転送クラスを取得します。
* 「Transferable.getTransferData」でドロップされたオブジェクトを受け取ります。
* ファイルは「List<File>」にキャストして操作するとよいです。
* 「DropTargetDropEvent.dropComplete」で転送完了を通知して終了です。
*/
public class DropTest extends JFrame implements DropTargetListener {
public static void main(String[] args) {
new DropTest();
}
JLabel label;
public DropTest() {
// ポイント2.「DropTargetListener」は「DropTarget」に設定します。
// new DropTarget(コンポーネント,
// リスナー);を実行すると、DropTargetの内部でaddDropTargetListenerされます。
new DropTarget(this, this);
setTitle("ドロップを受け取るだけのサンプル");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(100, 100, 300, 200);
label = new JLabel("ドロップ待ちです。");
add(label);
setVisible(true);
}
// ポイント1.ドロップイベントを受け取るには「DropTargetListener.drop」を実装します。
@Override
public void drop(DropTargetDropEvent dtde) {
// ポイント3.ドロップすると1.で実装した「drop」が実行されます。
// 「DropTargetDropEvent.acceptDrop」でドロップを受け取る準備をします。
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
boolean flg = false;
String str = "<html><pre>";
try {
// 「DropTargetDropEvent.getTransferable」で転送クラスを取得します。
Transferable tr = dtde.getTransferable();
// 「DropTargetDropEvent.isDataFlavorSupported」で、受け取り可能なフレーバーを調べます。
// 標準では文字列用の「stringFlavor」、ファイル用の「javaFileListFlavor」、画像イメージ用の「imageFlavor」があります。
if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) {
// 文字列をドロップされた場合
// ドロップされた文字列をラベルに表示します。
str += "文字列をドロップされました。\n";
// 「Transferable.getTransferData」でドロップされたオブジェクトを受け取ります。
str += tr.getTransferData(DataFlavor.stringFlavor).toString();
flg = true;
} else if (dtde
.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
// ファイルをドロップされた場合
// ドロップされたファイルを文字列に入れてラベルに表示します。
str += "ファイルをドロップされました。\n";
// 「Transferable.getTransferData」でドロップされたオブジェクトを受け取ります。
// ファイルは「List<File>」にキャストして操作するとよいです。
List<File> list = (List<File>) tr
.getTransferData(DataFlavor.javaFileListFlavor);
for (File file : list) {
str += file.getPath() + "\n";
}
flg = true;
}
str += "</pre></html>";
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 「DropTargetDropEvent.dropComplete」で転送完了を通知して終了です。
dtde.dropComplete(flg);
if (flg) {
// ドロップされたオブジェクトをJLabelに設定します。
label.setText(str);
} else {
// ドロップを受け取れなかった場合はこちらで。
label.setText("ドロップを受け取りできませんでした。");
}
}
}
// drop以外のメソッドは今回使わないので実装しません。
@Override
public void dragEnter(DropTargetDragEvent dtde) {
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
}
@Override
public void dragExit(DropTargetEvent dte) {
}
}
最終更新:2012年09月30日 17:47