kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

Swing ファイルのドラッグ&ドロップ

Swingを使って、エクスプローラからSwingアプリに対して、ファイルのドラッグ&ドロップを受け取るデモアプリを作成してみました。何の特徴もないです。

そういえば、Eclipse 3.4上で、Visual Editor(?)を利用して作成したんだけど、Eclipse上で実行すると、ドロップ処理が上手く動かなかったな〜。エクスプローラーからデモアプリにドラッグしても、ドロップ拒否のアイコンのマークが表示されていて、ドロップしてみても何も動作しなかった。コマンドラインから起動すると正常に動作した。

FileDropFrame.java

package filedrop;

import java.awt.BorderLayout;
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.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextArea;

import sample.DnDExam;

public class FileDropFrame extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JButton exitButton = null;
	private JTextArea jTextArea = null;

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

	/**
	 * This is the default constructor
	 */
	public FileDropFrame() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 *
	 * @return void
	 */
	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
		// this.pack();

		new DropTarget(this, DnDConstants.ACTION_MOVE, new MyDropTargetAdapter(
				jTextArea), true);

		new DropTarget(jTextArea, new MyDropTargetAdapter(jTextArea));
	}

	/**
	 * This method initializes jContentPane
	 *
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getExitButton(), BorderLayout.SOUTH);
			jContentPane.add(getJTextArea(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

	/**
	 * This method initializes exitButton
	 *
	 * @return javax.swing.JButton
	 */
	private JButton getExitButton() {
		if (exitButton == null) {
			exitButton = new JButton("終了");
			exitButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					System.exit(0);
				}
			});
		}
		return exitButton;
	}

	/**
	 * This method initializes jTextArea
	 *
	 * @return javax.swing.JTextArea
	 */
	private JTextArea getJTextArea() {
		if (jTextArea == null) {
			jTextArea = new JTextArea();
		}
		return jTextArea;
	}

	private class MyDropTargetAdapter extends DropTargetAdapter {
		private JTextArea textarea;

		public MyDropTargetAdapter(JTextArea textarea) {
			System.out.println("MyDropTargetAdapter");
			this.textarea = textarea;
		}

		public void drop(DropTargetDropEvent dtde) {
			System.out.println("MyDropTargetAdapter.drop");
			try {
				if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
					dtde.acceptDrop(DnDConstants.ACTION_COPY);
					Transferable transferable = dtde.getTransferable();
					List<File> list;
					list = (List<File>) transferable
							.getTransferData(DataFlavor.javaFileListFlavor);
					for (File file : list) {
						textarea.setText(file.toString() + "\n");
					}
					dtde.dropComplete(true);
				}
			} catch (UnsupportedFlavorException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			} catch (IOException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
		}
	}

}

MyDropTargetListener.java

package filedrop;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTargetAdapter;
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.JTextArea;

public class MyDropTargetListener extends DropTargetAdapter {
	private JTextArea textarea;

	public MyDropTargetListener(JTextArea textarea) {
		System.out.println("MyDropTargetListener");
		this.textarea = textarea;
	}

	public void drop(DropTargetDropEvent dtde) {
		System.out.println("MyDropTargetListener.drop");
		try {
			if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
				dtde.acceptDrop(DnDConstants.ACTION_COPY);
				Transferable transferable = dtde.getTransferable();
				List<File> list;
				list = (List<File>) transferable
						.getTransferData(DataFlavor.javaFileListFlavor);
				for (File file : list) {
					textarea.setText(file.toString() + "\n");
				}
				dtde.dropComplete(true);
			}
		} catch (UnsupportedFlavorException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}
}