• title: Fileのドラッグ&ドロップ tags: [DragAndDrop, JTable, DropTargetListener, TransferHandler] author: aterai pubdate: 2005-06-20 description: WindowsなどからファイルをJTableにドラッグ&ドロップします。

概要

WindowsなどからファイルをJTableにドラッグ&ドロップします。

サンプルコード

final FileModel model = new FileModel();
final JTable table = new JTable(model);
DropTargetListener dtl = new DropTargetAdapter() {
  @Override public void dragOver(DropTargetDragEvent dtde) {
    if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
      dtde.acceptDrag(DnDConstants.ACTION_COPY);
      return;
    }
    dtde.rejectDrag();
  }
  @Override public void drop(DropTargetDropEvent dtde) {
    try {
      if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
        dtde.acceptDrop(DnDConstants.ACTION_COPY);
        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 | IOException ex) {
      ex.printStackTrace();
    }
    dtde.rejectDrop();
  }
};
new DropTarget(table, DnDConstants.ACTION_COPY, dtl, true);
View in GitHub: Java, Kotlin

解説

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

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


JDK 1.6.0以降なら、以下のようなTransferHandlerを作成して使用する方法もあります。

table.setDropMode(DropMode.INSERT_ROWS);
table.setTransferHandler(new FileTransferHandler());
class FileTransferHandler extends TransferHandler {
  @Override public boolean importData(TransferSupport support) {
    try{
      if(canImport(support)) {
        JTable table = (JTable)support.getComponent();
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        for(Object o: (List)support.getTransferable().getTransferData(
            DataFlavor.javaFileListFlavor)) {
          if(o instanceof File) {
            File file = (File)o;
            model.addRow(new Object[] {
                file, file.length(), file.getAbsolutePath()});
          }
        }
        return true;
      }
    }catch(Exception ex) {
      ex.printStackTrace();
    }
    return false;
  }
  @Override public boolean canImport(TransferSupport support) {
    return support.isDataFlavorSupported(DataFlavor.javaFileListFlavor);
  }
}

参考リンク

コメント