JTabbedPaneのタブ上にリストアイテムをドロップ
Total: 3567
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JTabbedPane
のタブ上にドロップすることで、選択しているListItem
をそのタブ内にあるJList
へ移動します。
Screenshot
Advertisement
サンプルコード
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);
View in GitHub: Java, Kotlin解説
上記のサンプルでは、DropTarget
としてJTabbedPane
を指定しDropTargetListener#dragOver(...)
メソッドをオーバーライドしてマウスのドラッグポイントがそのタブ上(現在選択されているタブ以外)にある場合のみドロップ可能になるように設定しています。
- ドロップの可・不可は
DropTargetDragEvent#acceptDrag(...)
、DropTargetDragEvent#rejectDrag()
メソッドで切り替え可能
参考リンク
- JListの項目をドラッグ&ドロップ
- 上記のリンク先コメントからこのサンプルは分離、作成した