Swing/DropOnTabTitle のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- 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:
概要
JTabbedPane
のタブ上にドロップすることで、選択しているListItem
をそのタブ内にあるJList
へ移動します。
Screenshot
Advertisement
サンプルコード
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);
View in GitHub: Java, Kotlin解説
上記のサンプルでは、DropTarget
としてJTabbedPane
を指定し、DropTargetListener#dragOver(...)
メソッドをオーバーライドして、マウスのドラッグポイントがそのタブ上(現在選択されているタブ以外)にある場合のみドロップ可能になるように設定しています。
ドロップの可・不可は、DropTargetDragEvent#acceptDrag(...)
、DropTargetDragEvent#rejectDrag()
メソッドで切り替えることができます。
参考リンク
- JListの項目をドラッグ&ドロップ
- コメントを参照