Swing/DnDBetweenLists の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/DnDBetweenLists へ行く。
- Swing/DnDBetweenLists の差分を削除
--- category: swing folder: DnDBetweenLists title: JList間でのドラッグ&ドロップによるアイテムの移動 tags: [JList, DragAndDrop, TransferHandler] author: aterai pubdate: 2010-08-09T16:02:07+09:00 description: JList間でのドラッグ&ドロップによるアイテムの移動や並べ替えを行います。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTLUTkzH4I/AAAAAAAAAXY/tSQriEN1G_Y/s800/DnDBetweenLists.png hreflang: href: https://java-swing-tips.blogspot.com/2010/08/drag-and-drop-between-jlists.html lang: en --- * 概要 [#summary] `JList`間でのドラッグ&ドロップによるアイテムの移動や並べ替えを行います。 #download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTLUTkzH4I/AAAAAAAAAXY/tSQriEN1G_Y/s800/DnDBetweenLists.png) * サンプルコード [#sourcecode] #code(link){{ 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<?> transferredObjects = 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 transferredObjects; } 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 (!(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; } // ... }} * 解説 [#explanation] 上記のサンプルでは、一つの`JList`内でのアイテムの並べ替えを行う[[TransferHandlerを使ったJListのドラッグ&ドロップによる並べ替え>Swing/DnDReorderList]]を元に`ListItemTransferHandler`を作成し、`JList`間でのアイテム移動も可能にしています。 - ドロップ先がドラッグ元と同じコンポーネントかどうかを調査する処理を変更 -- [[TransferHandlerを使ってJTableの行をドラッグ&ドロップ、並べ替え>Swing/DnDReorderTable]]から[[JTableの行を別のJTableにドラッグして移動>Swing/DragRowsAnotherTable]]と同様 * 参考リンク [#reference] - [[TransferHandlerを使ったJListのドラッグ&ドロップによる並べ替え>Swing/DnDReorderList]] - [[JTableの行を別のJTableにドラッグして移動>Swing/DragRowsAnotherTable]] * コメント [#comment] #comment - リストアイテムをカット(KBD{Ctrl+X})すると`ClassCastException`が発生するバグを修正。 -- &user(aterai); &new{2011-02-25 (金) 20:28:45}; #comment