TITLE:JListをマウスクリックのみで複数選択する

Posted by terai at 2011-07-18

JListをマウスクリックのみで複数選択する

JListをアイテムをマウスクリックだけで複数選択できるように設定します。

  • &jnlp;
  • &jar;
  • &zip;
ListMouseSelection.png

サンプルコード

JList list = new JList(model) {
  private ClearSelectionListener listener;
  @Override public void setSelectionInterval(int anchor, int lead) {
    if(anchor==lead && lead>=0 && anchor>=0) {
      if(listener.isDragging) {
        addSelectionInterval(anchor, anchor);
      }else if(!listener.isInCellDragging) {
        if(isSelectedIndex(anchor)) {
          removeSelectionInterval(anchor, anchor);
        }else{
          addSelectionInterval(anchor, anchor);
        }
        listener.isInCellDragging = true;
      }
    }else{
      super.setSelectionInterval(anchor, lead);
    }
  }
};

解説

  • 左: Default
  • 中: MouseEvent
    • JList#processMouseEvent, JList#processMouseMotionEventをオーバーライドして、常にCtrlキーが押されている状態にする
    • JListの空白部分をクリックした場合、アイテムの選択状態は変更せず(MouseEvent#consume())、フォーカスだけJListに移動
    • 参考: Thread: JList where mouse click acts like ctrl-mouse click
JList list = new JList(model) {
  @Override protected void processMouseMotionEvent(MouseEvent e) {
    super.processMouseMotionEvent(convertMouseEvent(e));
  }
  @Override protected void processMouseEvent(MouseEvent e) {
    if(!getCellBounds(0, getModel().getSize()-1).contains(e.getPoint())) {
      e.consume();
      requestFocusInWindow();
    }else{
      super.processMouseEvent(convertMouseEvent(e));
    }
  }
  private MouseEvent convertMouseEvent(MouseEvent e) {
    //Thread: JList where mouse click acts like ctrl-mouse click
    //http://forums.oracle.com/forums/thread.jspa?messageID=5692411
    return new MouseEvent(
      (Component) e.getSource(),
      e.getID(), e.getWhen(),
      e.getModifiers() | InputEvent.CTRL_MASK,
      e.getX(), e.getY(),
      e.getXOnScreen(), e.getYOnScreen(),
      e.getClickCount(),
      e.isPopupTrigger(),
      e.getButton());
  }
};
  • 右: SelectionInterval
    • JList#setSelectionIntervalをオーバーライドして、ひとつのアイテムのセルを選択した場合は、JList#addSelectionInterval、JList#removeSelectionIntervalを使用するように変更
    • ひとつのアイテムのセル内でのドラッグでは、選択状態を変更しない
    • 参考: Thread: JList where mouse click acts like ctrl-mouse click
    • JListの空白部分をクリックした場合、アイテムの選択状態をすべてクリア(JListの選択を解除)

参考リンク

コメント