概要

JTabbedPaneのタブ上にドロップすることで、選択しているListItemをそのタブ内にあるJListへ移動します。

サンプルコード

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()メソッドで切り替え可能

参考リンク

コメント