TITLE:JListの選択を解除
Posted by aterai at 2011-04-18

JListの選択を解除

JListのセル選択状態を解除します。
  • 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

概要

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

サンプルコード

#spanend
#spanadd
class ClearSelectionListener extends MouseInputAdapter {
#spanend
  private boolean startOutside;

#spandel
**サンプルコード [#w9ea8a72]
#spanend
#spandel
#code{{
#spanend
#spandel
class ClearSelectionListener extends MouseAdapter {
#spanend
  private static void clearSelectionAndFocus(JList list) {
  private static <E> void clearSelectionAndFocus(JList<E> 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;
#spanadd

#spanend
  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;
  }
  private boolean startOuter = false;
#spanadd

#spanend
  @Override public void mousePressed(MouseEvent e) {
    JList list = (JList)e.getSource();
    startOuter = !contains(list, e.getPoint());
    if(startOuter) {
    JList<?> list = (JList<?>) e.getComponent();
    startOutside = !contains(list, e.getPoint());
    if (startOutside) {
      clearSelectionAndFocus(list);
    }
  }
#spanadd

#spanend
  @Override public void mouseReleased(MouseEvent e) {
    startOuter = false;
    startOutside = false;
  }
#spanadd

#spanend
  @Override public void mouseDragged(MouseEvent e) {
    JList list = (JList)e.getSource();
    if(contains(list, e.getPoint())) {
      startOuter = false;
    }else if(startOuter) {
    JList<?> list = (JList<?>) e.getComponent();
    if (contains(list, e.getPoint())) {
      startOutside = false;
    } else if (startOutside) {
      clearSelectionAndFocus(list);
    }
  }
}
View in GitHub: Java, Kotlin

解説

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

解説

上記のサンプルでは、JListのセル以外の領域をクリックするとすべてのセルの選択とフォーカスを解除するようにマウスリスナーなどを設定しています。
  • 選択解除
    • JList#clearSelection();
    • ListSelectionModel#clearSelection() のラッパー
    • JList#clearSelection();
      • ListSelectionModel#clearSelection()のカバーメソッド
  • フォーカス解除
    • list.getSelectionModel().setAnchorSelectionIndex(-1);
    • list.getSelectionModel().setLeadSelectionIndex(-1);
    • アンカー、リードの順番で解除する必要がある
    • list.getSelectionModel().setAnchorSelectionIndex(-1);
    • list.getSelectionModel().setLeadSelectionIndex(-1);
    • アンカー(アイテムのハイライト)、リード(アイテムのフォーカス)の順番で解除する必要がある

コメント

参考リンク

コメント