Swing/DnDList のバックアップ(No.34)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DnDList へ行く。
- 1 (2006-06-27 (火) 16:34:22)
- 2 (2006-06-29 (木) 15:24:49)
- 3 (2006-10-12 (木) 17:38:24)
- 4 (2007-03-05 (月) 13:39:32)
- 5 (2007-03-06 (火) 03:36:53)
- 6 (2007-03-27 (火) 04:54:17)
- 7 (2007-04-02 (月) 16:24:37)
- 8 (2007-08-16 (木) 17:27:30)
- 9 (2007-09-22 (土) 14:57:27)
- 10 (2007-09-22 (土) 16:16:29)
- 11 (2007-09-27 (木) 20:03:38)
- 12 (2007-09-28 (金) 02:24:23)
- 13 (2007-09-28 (金) 17:50:42)
- 14 (2007-09-28 (金) 19:57:32)
- 15 (2007-11-12 (月) 18:29:54)
- 16 (2009-11-16 (月) 10:48:42)
- 17 (2011-05-05 (木) 08:25:18)
- 18 (2013-04-04 (木) 02:32:23)
- 19 (2013-08-29 (木) 01:12:18)
- 20 (2014-04-25 (金) 18:33:23)
- 21 (2014-09-30 (火) 00:47:46)
- 22 (2014-10-07 (火) 17:42:21)
- 23 (2014-11-08 (土) 01:41:12)
- 24 (2014-11-25 (火) 03:03:31)
- 25 (2015-01-04 (日) 07:20:50)
- 26 (2015-08-21 (金) 18:38:25)
- 27 (2015-11-27 (金) 17:19:43)
- 28 (2016-05-22 (日) 21:20:18)
- 29 (2017-03-28 (火) 19:43:54)
- 30 (2017-04-04 (火) 14:17:08)
- 31 (2017-10-27 (金) 16:26:13)
- 32 (2017-12-01 (金) 18:46:02)
- 33 (2018-11-16 (金) 18:25:04)
- 34 (2020-11-06 (金) 09:18:44)
- 35 (2022-10-20 (木) 21:25:19)
- 36 (2025-01-03 (金) 08:57:02)
- 37 (2025-01-03 (金) 09:01:23)
- 38 (2025-01-03 (金) 09:02:38)
- 39 (2025-01-03 (金) 09:03:21)
- 40 (2025-01-03 (金) 09:04:02)
- category: swing folder: DnDList title: JListの項目をドラッグ&ドロップ tags: [JList, DragAndDrop] author: aterai pubdate: 2004-02-16 description: JListをドラッグ&ドロップして、項目を入れ替えます。 image:
概要
JList
をドラッグ&ドロップして、項目を入れ替えます。
Screenshot
Advertisement
サンプルコード
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (targetIndex >= 0) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(lineColor);
g2.fill(targetLine);
g2.dispose();
}
}
private void initTargetLine(Point p) {
Rectangle rect = getCellBounds(0, 0);
int cellHeight = rect.height;
int lineHeight = 2;
int modelSize = getModel().getSize();
targetIndex = -1;
targetLine.setSize(rect.width, lineHeight);
for (int i = 0; i < modelSize; i++) {
rect.setLocation(0, cellHeight * i - cellHeight / 2);
if (rect.contains(p)) {
targetIndex = i;
targetLine.setLocation(0, i * cellHeight);
break;
}
}
if (targetIndex < 0) {
targetIndex = modelSize;
targetLine.setLocation(0, targetIndex * cellHeight - lineHeight);
}
}
@Override public void dragOver(final DropTargetDragEvent e) {
if (isDragAcceptable(e)) {
e.acceptDrag(e.getDropAction());
} else {
e.rejectDrag();
return;
}
initTargetLine(e.getLocation());
repaint();
}
@Override public void drop(DropTargetDropEvent e) {
DefaultListModel model = (DefaultListModel) getModel();
Transferable t = e.getTransferable();
DataFlavor[] f = t.getTransferDataFlavors();
try {
if (isDropAcceptable(e)) {
Component comp = (Component) t.getTransferData(f[0]);
Object str = model.getElementAt(draggedIndex);
if (targetIndex == draggedIndex) {
setSelectedIndex(targetIndex);
} else if (targetIndex < draggedIndex) {
model.removeElementAt(draggedIndex);
model.insertElementAt(str, targetIndex);
setSelectedIndex(targetIndex);
} else {
model.insertElementAt(str, targetIndex);
model.removeElementAt(draggedIndex);
setSelectedIndex(targetIndex - 1);
}
e.dropComplete(true);
} else {
e.dropComplete(false);
}
} catch (UnsupportedFlavorException | IOException ex) {
e.dropComplete(false);
}
e.dropComplete(false);
targetIndex = -1;
repaint();
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、ドラッグソースとドラッグターゲットの両方をJList
自身に設定して、項目をドラッグ&ドロップしているように見せかけています。
- メモ:
- 複数アイテムを選択して移動する場合は、TransferHandlerを使ったJListのドラッグ&ドロップによる並べ替えのサンプルなどを参照
参考リンク
- Introduction to Drag and Drop and Data Transfer
- Swing (Archive) - DND from a JList with a single gesture
- Swing (Archive) - Smoother Drag Drop JList JTable
- TransferHandlerを使ったJListのドラッグ&ドロップによる並べ替え
- JListのアイテムをラバーバンドで複数選択、ドラッグ&ドロップで並べ替え