Swing/TableCellTransferHandler のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TableCellTransferHandler へ行く。
- 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:
概要
JTable
のセルを選択可能にし、ドラッグ&ドロップでそのセル内のIcon
をJList
にコピーできるようにTransferHandler
を設定します。
Screenshot
Advertisement
サンプルコード
//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解説
上記のサンプルでは、ドラッグ元のJTable
にCellIconTransferHandler
を設定して特定の列のアイコンのみドラッグ可能にし、ドロップ先のJList
にはTableCellTransferHandler
を設定してアイコンを受け取り(実際はJTable
ごと受け取って選択されたアイコンを取得)、これを一行で表示しています。
- テスト
clear
ボタン:JList
にドロップされたアイコンをクリアfilter
ボタン:JList
にドロップされたアイコンを含む行のみ表示するフィルタをJTable
に設定