TITLE:JListの項目をドラッグ&ドロップ

JListの項目をドラッグ&ドロップ

編集者:Terai Atsuhiro
作成日:2004-02-16
更新日:2022-10-20 (木) 21:25:19

概要

JListをドラッグ&ドロップして、項目を入れ替えます。

#screenshot

サンプルコード

private Rectangle2D raCueLine = new Rectangle2D.Float();
private Rectangle2D midArea   = new Rectangle2D.Float();
public void dragOver(final DropTargetDragEvent e) {
  Graphics2D g2  = (Graphics2D) list1.getGraphics();
  int cellHeight = (int) list1.getCellBounds(0,0).getHeight();
  int cellWidht  = (int) list1.getCellBounds(0,0).getWidth();
  boolean flag   = false;
  for(int i=0;i<=model.getSize();i++) {
    midArea.setRect(0, cellHeight*i - (int) (cellHeight/2), cellWidht, cellHeight);
    if(midArea.contains(e.getLocation())) {
      flag = true;
      targetIndex = i;
      g2.setColor(lineColor);
    }else{
      g2.setColor(list1.getBackground());
    }
    raCueLine.setRect(0, i*cellHeight, cellWidht, 2);
    g2.fill(raCueLine);
  }
  //セルの間にターゲットが無かった場合リストの一番下にラインを引く
  if(!flag) {
    targetIndex = model.getSize();
    raCueLine.setRect(0, targetIndex*cellHeight, cellWidht, 2);
    g2.setColor(lineColor);
    g2.fill(raCueLine);
  }
  if(isDragAcceptable(e)) {
    e.acceptDrag(e.getDropAction());
  }else{
    e.rejectDrag();
  }
  //選択がずれないように…
  list1.setSelectedIndex(draggedIndex);
}
public void drop(DropTargetDropEvent e) {
  Point point = e.getLocation();
  Transferable t = e.getTransferable();
  DataFlavor[] f = t.getTransferDataFlavors();
  try {
    if(isDropAcceptable(e)) {
      Component comp = (Component) t.getTransferData(f[0]);
      Object str = model.getElementAt(draggedIndex);
      if(targetIndex==draggedIndex) {
        list1.setSelectedIndex(targetIndex);
      }else if(targetIndex<draggedIndex) {
        model.removeElementAt(draggedIndex);
        model.insertElementAt(str, targetIndex);
        list1.setSelectedIndex(targetIndex);
      }else{
        model.insertElementAt(str, targetIndex);
        model.removeElementAt(draggedIndex);
        list1.setSelectedIndex(targetIndex-1);
      }
      e.dropComplete(true);
    }else{
      e.dropComplete(false);
    }
  }catch(UnsupportedFlavorException ex) {
    e.dropComplete(false);
  }catch(IOException ie) {
    e.dropComplete(false);
  }
  e.dropComplete(false);
  targetIndex = -1;
  list1.repaint();
}
  • &jnlp;
  • &jar;
  • &zip;

解説

ドラッグソースとドラッグターゲットの両方をJList自身に設定して、項目をドラッグ&ドロップしているように見せかけています。

参考リンク

コメント

  • 以下を修正しました。 -- terai
    • ドラッグで選択されたアイテムがずれにくいように修正
    • ドロップしたあとアイテムが選択状態になるように修正
    • アイテムの無い場所にドラッグすると一番最後の項目の下にラインを引くように修正(以前は一番下のアイテムの下半分にドラッグした場合のみ、そこに線を引いていた)