Sample4

Sample4の画像 エクスプローラからドラッグ&ドロップされたアイコンのファイル名を表示する。

ソースファイル

Sample4.jar Sample4.java


小技

ファイルのドラッグ&ドロップによるイベントを取得する

ドラッグ&ドロップのイベントを扱うには、DropTargetListener インターフェースを実装する必要があります。このプログラムの場合は、DropTargetListener を実装している DropTargetAdapter クラスを継承したサブクラスを用いています。
ドラッグ&ドロップのイベントでは、このリスナーと、主に Transferable クラス、DataFlavor クラスを使います。
この例ではコンストラクタの中で JTextArea に DropTarget を登録しています。

(例)
public void drop(DropTargetDropEvent e) {
	try {
		Transferable transfer = e.getTransferable();
		if (transfer.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
			e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
			java.util.List fileList =
				(java.util.List) (transfer.getTransferData(DataFlavor.javaFileListFlavor));
			setFileName(fileList);
		}
	} catch (Exception ex) {
		ex.printStackTrace();
	}
}

今回のソース


import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;

import javax.swing.*;

/*
 * Sample4.java
 * 2003/07/19
 * kota
 */

/**
 * @author kota
 */
public class Sample4 extends JFrame {
	private JTextArea textArea;

	public static void main(String[] args) {
		Sample4 sample4 = new Sample4();
		sample4.setVisible(true);
	}

	public Sample4() {
		super("Sample4");

		changeLookAndFeel();

		Container con = getContentPane();
		con.setLayout(new BorderLayout());
		textArea = new JTextArea(5, 50);
		JScrollPane scrollPane = new JScrollPane(textArea);
		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		con.add(scrollPane, BorderLayout.CENTER);

		pack();

		DropTarget target = new DropTarget(textArea, new MyDropTargetAdapter());

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setCenterLocation(this);
	}

	/**
	 * リスト内のファイル名を、textAreaに表示する。
	 * @param fileList
	 */
	private void setFileName(java.util.List fileList) {
		textArea.setText("");
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < fileList.size(); i++) {
			File file = (File) fileList.get(i);
			buffer.append(file.getAbsolutePath());
			buffer.append("\n");
		}
		textArea.setText(buffer.toString());
	}

	/**
	 * ドラッグ&ドロップイベントを受け取る。
	 * @author kota
	 */
	private class MyDropTargetAdapter extends DropTargetAdapter {
		public void drop(DropTargetDropEvent e) {
			try {
				Transferable transfer = e.getTransferable();
				if (transfer.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
					e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
					java.util.List fileList =
						(java.util.List) (transfer.getTransferData(
							DataFlavor.javaFileListFlavor));
					setFileName(fileList);
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}

	/**
	 * Look & Feel をOSのものに変更
	 */
	private void changeLookAndFeel() {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * ウィンドウをディスプレイの中心に配置する。
	 * @param frame ウィンドウ
	 */
	private void setCenterLocation(JFrame frame) {
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		int x = (d.width - frame.getWidth()) / 2;
		int y = (d.height - frame.getHeight()) / 2;
		frame.setLocation(x, y);
	}
}

SITE TOP BGM : Cornelius - CM2