Swing/DnDBetweenLists のバックアップ(No.14)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DnDBetweenLists へ行く。
- 1 (2010-12-20 (月) 22:03:13)
- 2 (2011-02-25 (金) 20:28:45)
- 3 (2012-12-28 (金) 12:40:39)
- 4 (2013-07-26 (金) 01:16:51)
- 5 (2014-09-30 (火) 01:20:10)
- 6 (2014-12-02 (火) 01:49:35)
- 7 (2015-02-17 (火) 22:29:28)
- 8 (2015-03-19 (木) 16:40:18)
- 9 (2015-03-29 (日) 15:20:21)
- 10 (2017-02-21 (火) 16:46:55)
- 11 (2017-12-28 (木) 22:27:36)
- 12 (2018-02-14 (水) 17:46:42)
- 13 (2018-02-24 (土) 19:51:30)
- 14 (2019-09-26 (木) 20:50:07)
- 15 (2019-10-23 (水) 21:27:50)
- 16 (2021-05-26 (水) 06:49:15)
- category: swing
folder: DnDBetweenLists
title: JList間でのドラッグ&ドロップによるアイテムの移動
tags: [JList, DragAndDrop, TransferHandler]
author: aterai
pubdate: 2010-08-09T16:02:07+09:00
description: JList間でのドラッグ&ドロップによるアイテムの移動や並べ替えを行います。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2010/08/drag-and-drop-between-jlists.html lang: en
概要
JList
間でのドラッグ&ドロップによるアイテムの移動や並べ替えを行います。
Screenshot
Advertisement
サンプルコード
class ListItemTransferHandler extends TransferHandler {
protected final DataFlavor localObjectFlavor;
protected JList<?> source;
protected int[] indices;
protected int addIndex = -1;
protected int addCount;
protected ListItemTransferHandler() {
super();
localObjectFlavor = new DataFlavor(List.class, "List of items");
}
@Override protected Transferable createTransferable(JComponent c) {
source = (JList<?>) c;
indices = source.getSelectedIndices();
List<?> transferedObjects = source.getSelectedValuesList();
return new Transferable() {
@Override public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] {localObjectFlavor};
}
@Override public boolean isDataFlavorSupported(DataFlavor flavor) {
return Objects.equals(localObjectFlavor, flavor);
}
@Override public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if (isDataFlavorSupported(flavor)) {
return transferedObjects;
} else {
throw new UnsupportedFlavorException(flavor);
}
}
};
}
@Override public boolean canImport(TransferHandler.TransferSupport info) {
return info.isDrop() && info.isDataFlavorSupported(localObjectFlavor);
}
@Override public int getSourceActions(JComponent c) {
return TransferHandler.MOVE;
}
@SuppressWarnings("unchecked")
@Override public boolean importData(TransferHandler.TransferSupport info) {
TransferHandler.DropLocation tdl = info.getDropLocation();
if (!canImport(info) || !(tdl instanceof JList.DropLocation)) {
return false;
}
JList.DropLocation dl = (JList.DropLocation) tdl;
JList<?> target = (JList<?>) info.getComponent();
DefaultListModel listModel = (DefaultListModel) target.getModel();
int max = listModel.getSize();
int index = dl.getIndex();
index = index < 0 ? max : index;
index = Math.min(index, max);
addIndex = index;
try {
List<?> values = (List<?>) info.getTransferable().getTransferData(
localObjectFlavor);
for (Object o : values) {
int i = index++;
listModel.add(i, o);
target.addSelectionInterval(i, i);
}
// ---->
addCount = target.equals(source) ? values.size() : 0;
// <----
return true;
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
return false;
}
// ...
View in GitHub: Java, Kotlin解説
上記のサンプルでは、一つのJList
内でのアイテムの並べ替えを行うTransferHandlerを使ったJListのドラッグ&ドロップによる並べ替えを元にListItemTransferHandler
を作成し、JList
間でのアイテム移動も可能にしています。
- ドロップ先がドラッグ元と同じコンポーネントかどうかを調査する処理を変更