概要

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

サンプルコード

class CellIconTransferHandler extends TransferHandler {
  public static final DataFlavor ICON_FLAVOR = new DataFlavor(Icon.class, "Icon");

  @Override protected Transferable createTransferable(JComponent c) {
    if (c instanceof JTable) {
      JTable table = (JTable) c;
      int row = table.getSelectedRow();
      int col = table.getSelectedColumn();
      if (Icon.class.isAssignableFrom(table.getColumnClass(col))) {
        // return new DataHandler(table, ICON_FLAVOR.getMimeType());
        return new Transferable() {
          @Override public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[] {ICON_FLAVOR};
          }

          @Override public boolean isDataFlavorSupported(DataFlavor flavor) {
            return Objects.equals(ICON_FLAVOR, flavor);
          }

          @Override public Object getTransferData(DataFlavor flavor)
                throws UnsupportedFlavorException {
            if (isDataFlavorSupported(flavor)) {
              return table.getValueAt(row, col);
            } else {
              throw new UnsupportedFlavorException(flavor);
            }
          }
        };
      }
    }
    return null;
  }

  @Override public boolean canImport(TransferHandler.TransferSupport info) {
    Component c = info.getComponent();
    if (c instanceof JList) {
      return info.isDrop() && info.isDataFlavorSupported(ICON_FLAVOR);
    }
    return false;
  }

  @Override public int getSourceActions(JComponent c) {
    return TransferHandler.COPY;
  }

  @SuppressWarnings("unchecked")
  @Override public boolean importData(TransferHandler.TransferSupport info) {
    JList<?> l = (JList<?>) info.getComponent();
    try {
      Object o = info.getTransferable().getTransferData(ICON_FLAVOR);
      if (o instanceof Icon) {
        ((DefaultListModel<Object>) l.getModel()).addElement(o);
      }
      return true;
    } catch (UnsupportedFlavorException | IOException ex) {
      return false;
    }
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、ドラッグ元のJTableCellIconTransferHandlerを設定して特定の列のアイコンのみドラッグ可能にし、ドロップ先のJListはアイコンを受け取って表示しています。

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

参考リンク

コメント