Swing/DropOnTabTitle の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/DropOnTabTitle へ行く。
- Swing/DropOnTabTitle の差分を削除
--- category: swing folder: DropOnTabTitle title: JTabbedPaneのタブ上にリストアイテムをドロップ tags: [JTabbedPane, JList, DragAndDrop] author: aterai pubdate: 2014-10-27T00:01:06+09:00 description: JTabbedPaneのタブ上にドロップすることで、選択しているListItemをそのタブ内にあるJListへ移動します。 image: https://lh5.googleusercontent.com/-oMjKQSnXvmM/VEzg70T1BQI/AAAAAAAANnU/Exu8u5wYyAw/s800/DropOnTabTitle.png --- * 概要 [#summary] `JTabbedPane`のタブ上にドロップすることで、選択している`ListItem`をそのタブ内にある`JList`へ移動します。 #download(https://lh5.googleusercontent.com/-oMjKQSnXvmM/VEzg70T1BQI/AAAAAAAANnU/Exu8u5wYyAw/s800/DropOnTabTitle.png) * サンプルコード [#sourcecode] #code(link){{ new DropTarget(jtp, DnDConstants.ACTION_MOVE, new DropTargetListener() { private int targetTabIndex = -1; @Override public void dropActionChanged(DropTargetDragEvent e) {} @Override public void dropActionChanged(DropTargetDragEvent e) { // repaint(); } @Override public void dragExit(DropTargetEvent e) {} @Override public void dragExit(DropTargetEvent e) { // repaint(); } @Override public void dragEnter(DropTargetDragEvent e) {} @Override public void dragEnter(DropTargetDragEvent e) { // repaint(); } @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); }} * 解説 [#explanation] 上記のサンプルでは、`DropTarget`として`JTabbedPane`を指定し`DropTargetListener#dragOver(...)`メソッドをオーバーライドしてマウスのドラッグポイントがそのタブ上(現在選択されているタブ以外)にある場合のみドロップ可能になるように設定しています。 - ドロップの可・不可は`DropTargetDragEvent#acceptDrag(...)`、`DropTargetDragEvent#rejectDrag()`メソッドで切り替え可能 * 参考リンク [#reference] - [[JListの項目をドラッグ&ドロップ>Swing/DnDList]] -- 上記のリンク先コメントからこのサンプルは分離、作成した * コメント [#comment] #comment #comment