Swing/ClearSelection のバックアップソース(No.9)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/ClearSelection へ行く。
- 1 (2011-04-18 (月) 14:47:37)
- 2 (2011-04-19 (火) 13:59:30)
- 3 (2012-12-22 (土) 15:58:00)
- 4 (2014-11-12 (水) 02:09:03)
- 5 (2015-01-22 (木) 21:18:17)
- 6 (2015-02-18 (水) 15:04:15)
- 7 (2016-12-03 (土) 18:28:31)
- 8 (2017-04-04 (火) 14:17:08)
- 9 (2017-12-01 (金) 13:21:53)
- 10 (2019-08-08 (木) 18:57:58)
- 11 (2021-04-09 (金) 19:43:33)
- 12 (2021-11-24 (水) 06:33:00)
--- 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 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); } } } }} * 解説 [#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)] * コメント [#comment] #comment #comment