• category: swing folder: TableCellTransferHandler title: JTableのセルを選択してJListにドラッグ&ドロップでIconをコピーする tags: [JTable, JList, DragAndDrop, TransferHandler, Icon] author: aterai pubdate: 2015-05-25T00:03:51+09:00 description: JTableのセルを選択可能にし、ドラッグ&ドロップでそのセル内のIconをJListにコピーできるようにTransferHandlerを設定します。 image: https://lh3.googleusercontent.com/-TUrxk7yYqYM/VWHkR1mENvI/AAAAAAAAN4w/bEU29WIgjOE/s800/TableCellTransferHandler.png

概要

JTableのセルを選択可能にし、ドラッグ&ドロップでそのセル内のIconJListにコピーできるようにTransferHandlerを設定します。

サンプルコード

//DataFlavor FLAVOR = new ActivationDataFlavor(JTable.class, DataFlavor.javaJVMLocalObjectMimeType, "JTable");
class CellIconTransferHandler extends TransferHandler {
  private final DataFlavor localObjectFlavor;
  public CellIconTransferHandler(DataFlavor flavor) {
    super();
    localObjectFlavor = flavor;
  }
  @Override protected Transferable createTransferable(JComponent c) {
    JTable table = (JTable) c;
    int idx = table.getSelectedColumn();
    if (Icon.class.isAssignableFrom(table.getColumnClass(idx))) {
        return new DataHandler(table, localObjectFlavor.getMimeType());
    }
    return null;
  }
  @Override public boolean canImport(TransferSupport info) {
    return false;
  }
  @Override public int getSourceActions(JComponent c) {
    return TransferHandler.COPY;
  }
}

class TableCellTransferHandler extends TransferHandler {
  private final DataFlavor localObjectFlavor;
  public TableCellTransferHandler(DataFlavor flavor) {
    super();
    localObjectFlavor = flavor;
  }
  @Override public boolean canImport(TransferSupport info) {
    Component c = info.getComponent();
    if (c instanceof JList) {
      return info.isDrop() && info.isDataFlavorSupported(localObjectFlavor);
    }
    return false;
  }
  @Override public int getSourceActions(JComponent c) {
    return TransferHandler.COPY;
  }
  @SuppressWarnings("unchecked")
  @Override public boolean importData(TransferSupport info) {
    if (!canImport(info)) {
      return false;
    }
    JList l = (JList) info.getComponent();
    try {
      Object o = info.getTransferable().getTransferData(localObjectFlavor);
      if (o instanceof JTable) {
        JTable t = (JTable) o;
        Object obj = t.getValueAt(t.getSelectedRow(), t.getSelectedColumn());
        ((DefaultListModel) l.getModel()).addElement(obj);
      }
      return true;
    } catch (UnsupportedFlavorException | IOException ex) {
      ex.printStackTrace();
    }
    return false;
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、ドラッグ元のJTableCellIconTransferHandlerを設定して特定の列のアイコンのみドラッグ可能にし、ドロップ先のJListにはTableCellTransferHandlerを設定してアイコンを受け取り(実際はJTableごと受け取って選択されたアイコンを取得)、これを一行で表示しています。

  • テスト
    • clearボタン: JListにドロップされたアイコンをクリア
    • filterボタン: JListにドロップされたアイコンを含む行のみ表示するフィルタをJTableに設定

コメント