TITLE:Fileのドラッグ&ドロップ
#navi(../)
RIGHT:Posted by [[terai]] at 2005-06-20
*Fileのドラッグ&ドロップ [#f37e5330]
WidnowsなどからファイルをJTableにドラッグ&ドロップします。

//-&jnlp;
-&jar;
-&zip;

//#screenshot
http://lh4.ggpht.com/_9Z4BYR88imo/TQTMhxsIIsI/AAAAAAAAAZU/iZ6Pn8yTFFM/s800/FileListFlavor.png

**サンプルコード [#t647511e]
#code{{
DropTargetListener dtl = new DropTargetAdapter() {
  public void dragOver(DropTargetDragEvent dtde) {
    if(dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
      dtde.acceptDrag(DnDConstants.ACTION_COPY);
      return;
    }
    dtde.rejectDrag();
  }
  public void drop(DropTargetDropEvent dtde) {
    try {
      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()));
          }
        }
        dtde.dropComplete(true);
        return;
      }
    }catch(UnsupportedFlavorException ufe) {
      ufe.printStackTrace();
    }catch(IOException ioe) {
      ioe.printStackTrace();
    }
    dtde.rejectDrop();
  }
};
DropTarget dt = new DropTarget(tbl,DnDConstants.ACTION_COPY,dtl,true);
}}

**解説 [#p8d48bbf]
Windowsのエクスプローラなどからファイルを選択(複数可)し、上記のサンプルアプリ上にドラッグ&ドロップするとファイル名などをJTableに表示しています。

ドロップされたDataFlavorが、DataFlavor.javaFileListFlavorの場合だけ、これをファイルとして処理するDropTargetListenerを作成しています。

----
JDK 1.6 以降なら、以下のようなTransferHandlerを作成して使用する方法もあります。
#code{{
table.setDropMode(DropMode.INSERT_ROWS);
table.setTransferHandler(new FileTransferHandler());
}}

#code{{
class FileTransferHandler extends TransferHandler {
  @Override public boolean importData(JComponent component, Transferable transferable) {
    try{
      if(canImport(component, transferable.getTransferDataFlavors())) {
        //DefaultTableModel model = (DefaultTableModel)((JTable)component).getModel();
        TestModel model = (TestModel)((JTable)component).getModel();
        for(Object o: (List)transferable.getTransferData(DataFlavor.javaFileListFlavor)) {
          if(o instanceof File) {
            File file = (File)o;
            //model.addRow(new Object[] {file, file.length(), file.getAbsolutePath()});
            model.addTest(new Test(file.getName(), file.getAbsolutePath()));
          }
        }
        return true;
      }
    }catch(Exception ex) {
      ex.printStackTrace();
    }
    return false;
  }
  @Override public boolean canImport(JComponent component, DataFlavor[] flavors) {
    for(DataFlavor f: flavors) {
      if(DataFlavor.javaFileListFlavor.equals(f)) {
        return true;
      }
    }
    return false;
  }
  @Override public int getSourceActions(JComponent component) {
    return COPY;
  }
}
}}

**参考リンク [#tf100a65]
-[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]]

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