Swing/DnDBetweenLists のバックアップの現在との差分(No.2)
TITLE:JList間でのドラッグ&ドロップによるアイテムの移動
Posted by aterai at 2010-08-09
JList間でのドラッグ&ドロップによるアイテムの移動
JList間でのドラッグ&ドロップによるアイテムの移動や並べ替えを行います。-
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
間でのドラッグ&ドロップによるアイテムの移動や並べ替えを行います。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#spanend
#spanadd
class ListItemTransferHandler extends TransferHandler {
#spanend
protected final DataFlavor localObjectFlavor;
protected JList<?> source;
protected int[] indices;
protected int addIndex = -1;
protected int addCount;
#spandel
**サンプルコード [#s91101a9]
#spanend
#spandel
#code{{
#spanend
#spandel
class ListItemTransferHandler extends TransferHandler {
#spanend
private JList source = null;
protected ListItemTransferHandler() {
super();
localObjectFlavor = new DataFlavor(List.class, "List of items");
}
#spanadd
#spanend
@Override protected Transferable createTransferable(JComponent c) {
source = (JList) c;
source = (JList<?>) c;
indices = source.getSelectedIndices();
transferedObjects = source.getSelectedValues();
return new DataHandler(transferedObjects, localObjectFlavor.getMimeType());
List<?> transferredObjects = source.getSelectedValuesList();
return new Transferable() {
@Override public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] {localObjectFlavor};
}
#spanadd
#spanend
@Override public boolean isDataFlavorSupported(DataFlavor flavor) {
return Objects.equals(localObjectFlavor, flavor);
}
#spanadd
#spanend
@Override public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if (isDataFlavorSupported(flavor)) {
return transferredObjects;
} else {
throw new UnsupportedFlavorException(flavor);
}
}
};
}
@Override public boolean importData(TransferSupport info) {
if (!canImport(info)) return false;
JList target = (JList)info.getComponent();
JList.DropLocation dl = (JList.DropLocation)info.getDropLocation();
DefaultListModel listModel = (DefaultListModel)target.getModel();
#spanadd
#spanend
@Override public boolean canImport(TransferHandler.TransferSupport info) {
return info.isDrop() && info.isDataFlavorSupported(localObjectFlavor);
}
#spanadd
#spanend
@Override public int getSourceActions(JComponent c) {
return TransferHandler.MOVE;
}
#spanadd
#spanend
@SuppressWarnings("unchecked")
@Override public boolean importData(TransferHandler.TransferSupport info) {
TransferHandler.DropLocation tdl = info.getDropLocation();
if (!(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();
int max = listModel.getSize();
if(index<0 || index>max) index = max;
index = index < 0 ? max : index;
index = Math.min(index, max);
addIndex = index;
try{
Object[] values = (Object[])info.getTransferable().getTransferData(localObjectFlavor);
for(int i=0;i<values.length;i++) {
int idx = index++;
listModel.add(idx, values[i]);
target.addSelectionInterval(idx, idx);
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==source)? values.length : 0;
//<----
// ---->
addCount = target.equals(source) ? values.size() : 0;
// <----
return true;
}catch(UnsupportedFlavorException ufe) {
ufe.printStackTrace();
}catch(java.io.IOException ioe) {
ioe.printStackTrace();
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
return false;
}
#spandel
//......
#spanend
// ...
View in GitHub: Java, Kotlin解説
上記のサンプルでは、一つのJList内でのアイテムの並べ替えを行うTransferHandlerを使ったJListのドラック&ドロップによる並べ替えを元にListItemTransferHandlerを作成し、JList間でのアイテム移動もできるようになっています。変更した箇所は、TransferHandlerを使ってJTableの行をドラック&ドロップ、並べ替えから、JTableの行を別のJTableにドラッグして移動と同じで、ドロップ先がドラッグ元と同じかどうかを調べて処理を変更しているだけです。解説
上記のサンプルでは、一つのJList
内でのアイテムの並べ替えを行うTransferHandlerを使ったJListのドラッグ&ドロップによる並べ替えを元にListItemTransferHandler
を作成し、JList
間でのアイテム移動も可能にしています。
参考リンク
- TransferHandlerを使ったJListのドラック&ドロップによる並べ替え
- JTableの行を別のJTableにドラッグして移動
- ドロップ先がドラッグ元と同じコンポーネントかどうかを調査する処理を変更