概要

JListのセル選択状態をセル以外の余白領域をクリックすることで解除できるように設定します。

サンプルコード

class ClearSelectionListener extends MouseAdapter {
  private static void clearSelectionAndFocus(JList list) {
    list.clearSelection();
    list.getSelectionModel().setAnchorSelectionIndex(-1);
    list.getSelectionModel().setLeadSelectionIndex(-1);
  }
  private static boolean contains(JList list, Point pt) {
    for (int i = 0; i < list.getModel().getSize(); i++) {
      Rectangle r = list.getCellBounds(i, i);
      if (r.contains(pt)) return true;
    }
    return false;
  }
  private boolean startOutside = false;
  @Override public void mousePressed(MouseEvent e) {
    JList list = (JList) e.getSource();
    startOutside = !contains(list, e.getPoint());
    if (startOutside) {
      clearSelectionAndFocus(list);
    }
  }
  @Override public void mouseReleased(MouseEvent e) {
    startOutside = false;
  }
  @Override public void mouseDragged(MouseEvent e) {
    JList list = (JList) e.getSource();
    if (contains(list, e.getPoint())) {
      startOutside = false;
    } else if (startOutside) {
      clearSelectionAndFocus(list);
    }
  }
}
view all

解説

上記のサンプルでは、JListのセル以外の領域をクリックすると、すべてのセルの選択とフォーカスを解除するようにマウスリスナーなどを設定しています。

  • 選択解除
    • JList#clearSelection();
    • ListSelectionModel#clearSelection()のラッパー
  • フォーカス解除
    • list.getSelectionModel().setAnchorSelectionIndex(-1);
    • list.getSelectionModel().setLeadSelectionIndex(-1);
    • アンカー(アイテムのハイライト)、リード(アイテムのフォーカス)の順番で解除する必要がある

参考リンク

コメント