ドラッグアンドドロップのサンプル 1.ドロップを受け取るだけのサンプル(文字列、ファイル)


ドラッグアンドドロップの入り口として、ドロップを受け取るだけのサンプルを書いてみました。
エクスプローラからファイルをドロップしたい!なんて場合も、この簡単なサンプルだけで十分です。

ポイント

  1. ドロップイベントを受け取るには「DropTargetListener.drop」を実装します。
  2. 「DropTargetListener」は「DropTarget」に設定します。
    1. new DropTarget(コンポーネント, リスナー);を実行すると、DropTargetの内部でaddDropTargetListenerされます。
  3. ドロップすると1.で実装した「drop」が実行されます。
    1. 「DropTargetDropEvent.acceptDrop」でドロップを受け取る準備をします。
    2. 「DropTargetDropEvent.isDataFlavorSupported」で、受け取り可能なフレーバーを調べます。
      1. 標準では文字列用の「stringFlavor」、ファイル用の「javaFileListFlavor」、画像イメージ用の「imageFlavor」があります。
    3. 「DropTargetDropEvent.getTransferable」で転送クラスを取得します。
    4. 「Transferable.getTransferData」でドロップされたオブジェクトを受け取ります。
      1. ファイルは「List<File>」にキャストして操作するとよいです。
    5. 「DropTargetDropEvent.dropComplete」で転送完了を通知して終了です。

実行結果

テキストドロップ



エクスプローラからファイルドロップ



ソース DropTest.java

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) {
	}
 
}