「Java/swing/サンプル/ドロップを受け取るサンプル(文字列、ファイル)」の編集履歴(バックアップ)一覧に戻る

Java/swing/サンプル/ドロップを受け取るサンプル(文字列、ファイル) - (2012/09/30 (日) 04:02:35) のソース

*ドラッグアンドドロップのサンプル 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」で転送完了を通知して終了です。

*** ソース &ref(DropTest.java)
#highlight(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) {
	}

}
}}