Swing/DropOnTabTitle のバックアップ差分(No.2)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/DropOnTabTitle へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
--- title: JTabbedPaneのタブ上にリストアイテムをドロップ tags: [JTabbedPane, JList, DragAndDrop] author: aterai pubdate: 2014-10-27 pubdate: 2014-10-27T00:01:06+09:00 description: JTabbedPaneのタブ上にドロップすることで、選択しているListItemをそのタブ内にあるJListへ移動します。 --- * 概要 [#xc0cff8b] `JTabbedPane`のタブ上にドロップすることで、選択している`ListItem`をそのタブ内にある`JList`へ移動します。 #download(https://lh5.googleusercontent.com/-oMjKQSnXvmM/VEzg70T1BQI/AAAAAAAANnU/Exu8u5wYyAw/s800/DropOnTabTitle.png) * サンプルコード [#of6fb758] #code(link){{ new DropTarget(jtp, DnDConstants.ACTION_MOVE, new DropTargetListener() { private int targetTabIndex = -1; @Override public void dropActionChanged(DropTargetDragEvent e) {} @Override public void dragExit(DropTargetEvent e) {} @Override public void dragEnter(DropTargetDragEvent e) {} @Override public void dragOver(DropTargetDragEvent e) { if (isDropAcceptable(e)) { e.acceptDrag(e.getDropAction()); } else { e.rejectDrag(); } repaint(); } @SuppressWarnings("unchecked") @Override public void drop(DropTargetDropEvent e) { try { Transferable t = e.getTransferable(); DataFlavor[] f = t.getTransferDataFlavors(); JList<String> sourceList = (JList<String>) t.getTransferData(f[0]); JList<String> targetList = listArray.get(targetTabIndex); DefaultListModel<String> tm = (DefaultListModel<String>) targetList.getModel(); DefaultListModel<String> sm = (DefaultListModel<String>) sourceList.getModel(); int[] indices = sourceList.getSelectedIndices(); for (int j = indices.length - 1; j >= 0; j--) { tm.addElement(sm.remove(indices[j])); } e.dropComplete(true); } catch (UnsupportedFlavorException | IOException ie) { e.dropComplete(false); } } private boolean isDropAcceptable(DropTargetDragEvent e) { Transferable t = e.getTransferable(); DataFlavor[] f = t.getTransferDataFlavors(); Point pt = e.getLocation(); targetTabIndex = -1; for (int i = 0; i < jtp.getTabCount(); i++) { if (jtp.getBoundsAt(i).contains(pt)) { targetTabIndex = i; break; } } return targetTabIndex >= 0 && targetTabIndex != jtp.getSelectedIndex() && t.isDataFlavorSupported(f[0]); } }, true); }} * 解説 [#lc8b22af] 上記のサンプルでは、`DropTarget`に`JTabbedPane`を設定し、`DropTargetListener#dragOver(...)`メソッドをオーバーライドして、マウスのドラッグポイントがタブ上(現在選択されているタブ以外)にある場合のみドロップ可能になるように、`DropTargetDragEvent#acceptDrag(...)、`DropTargetDragEvent#rejectDrag()`で切り替えています。 上記のサンプルでは、`DropTarget`に`JTabbedPane`を設定し、`DropTargetListener#dragOver(...)`メソッドをオーバーライドして、マウスのドラッグポイントがタブ上(現在選択されているタブ以外)にある場合のみドロップ可能になるように、`DropTargetDragEvent#acceptDrag(...)`、`DropTargetDragEvent#rejectDrag()`で切り替えています。 * 参考リンク [#i2c00efd] - [[JListの項目をドラッグ&ドロップ>Swing/DnDList]] -- コメントを参照 * コメント [#i63e920d] #comment