Swing/TableCellTransferHandler のバックアップ(No.10)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TableCellTransferHandler へ行く。
- 1 (2015-12-15 (火) 17:07:09)
- 2 (2017-06-04 (日) 13:20:46)
- 3 (2017-11-17 (金) 17:58:02)
- 4 (2019-06-28 (金) 20:35:26)
- 5 (2019-10-23 (水) 21:26:37)
- 6 (2021-05-22 (土) 04:40:12)
- 7 (2021-11-24 (水) 06:34:17)
- 8 (2025-01-03 (金) 08:57:02)
- 9 (2025-01-03 (金) 09:01:23)
- 10 (2025-01-03 (金) 09:02:38)
- 11 (2025-01-03 (金) 09:03:21)
- 12 (2025-01-03 (金) 09:04:02)
- 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:
Summary
JTable
のセルを選択可能にし、ドラッグ&ドロップでそのセル内のIcon
をJList
にコピーできるようにTransferHandler
を設定します。
Screenshot

Advertisement
Source Code Examples
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解説
上記のサンプルでは、ドラッグ元のJTable
にCellIconTransferHandler
を設定して特定の列のアイコンのみドラッグ可能にし、ドロップ先のJList
はアイコンを受け取って表示しています。
clear
ボタン:JList
にドロップされたアイコンをクリアfilter
ボタン:JList
にドロップされたアイコンを含む行のみ表示するフィルタをJTable
に設定