---
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