---
category: swing
folder: ClearSelection
title: JListの選択を解除
tags: [JList, Focus, MouseListener]
author: aterai
pubdate: 2011-04-18T14:47:37+09:00
description: JListのセル選択状態をセル以外の余白領域をクリックすることで解除できるように設定します。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TavH8_fQKAI/AAAAAAAAA5s/MyUXQnSHPUA/s800/ClearSelection.png
---
* 概要 [#summary]
`JList`のセル選択状態をセル以外の余白領域をクリックすることで解除できるように設定します。

#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TavH8_fQKAI/AAAAAAAAA5s/MyUXQnSHPUA/s800/ClearSelection.png)

* サンプルコード [#sourcecode]
#code(link){{
class ClearSelectionListener extends MouseAdapter {
  private boolean startOutside = false;
class ClearSelectionListener extends MouseInputAdapter {
  private boolean startOutside;

  private static <E> void clearSelectionAndFocus(JList<E> list) {
    list.clearSelection();
    list.getSelectionModel().setAnchorSelectionIndex(-1);
    list.getSelectionModel().setLeadSelectionIndex(-1);
  }

  private static <E> boolean contains(JList<E> list, Point pt) {
    for (int i = 0; i < list.getModel().getSize(); i++) {
      if (list.getCellBounds(i, i).contains(pt)) {
        return true;
      }
    }
    return false;
  }

  @Override public void mousePressed(MouseEvent e) {
    JList list = (JList) e.getSource();
    JList<?> list = (JList<?>) e.getComponent();
    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();
    JList<?> list = (JList<?>) e.getComponent();
    if (contains(list, e.getPoint())) {
      startOutside = false;
    } else if (startOutside) {
      clearSelectionAndFocus(list);
    }
  }

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

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

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

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/tutorial/uiswing/events/listselectionlistener.html How to Write a List Selection Listener (The Java™ Tutorials > Creating a GUI With JFC/Swing > Writing Event Listeners)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JList.html#clearSelection-- JList#clearSelection() (Java Platform SE 8)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/ListSelectionModel.html#clearSelection-- ListSelectionModel#clearSelection() (Java Platform SE 8)]

* コメント [#comment]
#comment
#comment