---
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 [#summary]
`JTabbedPane`のタブ上にドロップすることで、選択している`ListItem`をそのタブ内にある`JList`へ移動します。
#download(https://lh5.googleusercontent.com/-oMjKQSnXvmM/VEzg70T1BQI/AAAAAAAANnU/Exu8u5wYyAw/s800/DropOnTabTitle.png)
* Source Code Examples [#sourcecode]
#code(link){{
new DropTarget(jtp, DnDConstants.ACTION_MOVE, new DropTargetListener() {
private int targetTabIndex = -1;
@Override public void dropActionChanged(DropTargetDragEvent e) {
// repaint();
}
@Override public void dragExit(DropTargetEvent e) {
// repaint();
}
@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);
}}
* Description [#explanation]
* Description [#description]
上記のサンプルでは、`DropTarget`として`JTabbedPane`を指定し`DropTargetListener#dragOver(...)`メソッドをオーバーライドしてマウスのドラッグポイントがそのタブ上(現在選択されているタブ以外)にある場合のみドロップ可能になるように設定しています。
- ドロップの可・不可は`DropTargetDragEvent#acceptDrag(...)`、`DropTargetDragEvent#rejectDrag()`メソッドで切り替え可能
* Reference [#reference]
- [[JListの項目をドラッグ&ドロップ>Swing/DnDList]]
-- 上記のリンク先コメントからこのサンプルは分離、作成した
* Comment [#comment]
#comment
#comment