• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:Fileのドラッグ&ドロップ
#navi(../)
*Fileのドラッグ&ドロップ [#f37e5330]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-06-20~
更新日:&lastmod;
---
category: swing
folder: FileListFlavor
title: Fileのドラッグ&ドロップ
tags: [DragAndDrop, JTable, DropTargetListener, TransferHandler]
author: aterai
pubdate: 2005-06-20T11:06:07+09:00
description: WindowsなどからファイルをJTableにドラッグ&ドロップします。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTMhxsIIsI/AAAAAAAAAZU/iZ6Pn8yTFFM/s800/FileListFlavor.png
---
* 概要 [#summary]
`Windows`などからファイルを`JTable`にドラッグ&ドロップします。

#contents
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTMhxsIIsI/AAAAAAAAAZU/iZ6Pn8yTFFM/s800/FileListFlavor.png)

**概要 [#kb693f4d]
WidnowsなどからファイルをJTableにドラッグ&ドロップします。

#screenshot

**サンプルコード [#t647511e]
#code{{
* サンプルコード [#sourcecode]
#code(link){{
FileModel model = new FileModel();
JTable table = new JTable(model);
DropTargetListener dtl = new DropTargetAdapter() {
  public void dragOver(DropTargetDragEvent dtde) {
    if(dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
  @Override public void dragOver(DropTargetDragEvent dtde) {
    if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
      dtde.acceptDrag(DnDConstants.ACTION_COPY);
      return;
    }
    dtde.rejectDrag();
  }
  public void drop(DropTargetDropEvent dtde) {

  @Override public void drop(DropTargetDropEvent dtde) {
    try {
      if(dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
      if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
        dtde.acceptDrop(DnDConstants.ACTION_COPY);
        Transferable t = dtde.getTransferable();
        java.util.List list = (java.util.List)t.getTransferData(
                                 DataFlavor.javaFileListFlavor);
        for(Object o: list) {
          if(o instanceof File) {
            File f = (File) o;
            model.addTest(new Test(f.getName(),f.getAbsolutePath()));
        Transferable transferable = dtde.getTransferable();
        List list = (List) transferable.getTransferData(
            DataFlavor.javaFileListFlavor);
        for (Object o: list) {
          if (o instanceof File) {
            File file = (File) o;
            model.addFileName(
                new FileName(file.getName(), file.getAbsolutePath()));
          }
        }
        dtde.dropComplete(true);
        return;
      }
    }catch(UnsupportedFlavorException ufe) {
      ufe.printStackTrace();
    }catch(IOException ioe) {
      ioe.printStackTrace();
    } catch (UnsupportedFlavorException | IOException ex) {
      ex.printStackTrace();
    }
    dtde.rejectDrop();
  }
};
DropTarget dt = new DropTarget(tbl,DnDConstants.ACTION_COPY,dtl,true);
new DropTarget(table, DnDConstants.ACTION_COPY, dtl, true);
}}
//-&jnlp;
-&jar;
-&zip;

**解説 [#p8d48bbf]
Windowsのエクスプローラなどからファイルを選択(複数可)し、上記のサンプルアプリ上にドラッグ&ドロップするとファイル名などをJTableに表示しています。
* 解説 [#explanation]
- `Windows`のファイルエクスプローラなどからファイルを選択(複数選択可)、ドラッグ、`JTable`上にドロップでファイル名などを一覧表示
- ドロップされた`DataFlavor`が`DataFlavor.javaFileListFlavor`の場合のみ、これをファイルとして処理する`DropTargetListener`を作成
- `JDK 1.6.0`以降では以下のような`TransferHandler`が使用可能
-- [[JTableでファイルとディレクトリを別々にソート>Swing/FileDirectoryComparator]]に移動

ドロップされたDataFlavorが、DataFlavor.javaFileListFlavorの場合だけ、これをファイルとして処理するDropTargetListenerを作成しています。
* 参考リンク [#reference]
- [http://www5.big.or.jp/~tera/Labo/Java2/j2dnd.html Java2: WindowsからのDrag and Drop]
- [http://www.ne.jp/asahi/j.nihei/personal/linuxDragDrop.html java drag and drop]
- [[JTable自体の高さを拡張>Swing/FillsViewportHeight]]

**参考リンク [#tf100a65]
-[[Java2: WindowsからのDrag and Drop>http://www5.big.or.jp/~tera/Labo/Java2/j2dnd.html]]
-[[java drag and drop>http://www.ne.jp/asahi/j.nihei/personal/linuxDragDrop.html]]

**コメント [#i79a7ae9]
* コメント [#comment]
#comment
#comment