Swing/FilterListItems のバックアップ差分(No.9)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/FilterListItems へ行く。
- 1 (2016-09-05 (月) 00:19:37)
- 2 (2016-09-05 (月) 15:28:13)
- 3 (2016-11-24 (木) 20:31:01)
- 4 (2017-02-20 (月) 19:40:38)
- 5 (2017-02-28 (火) 17:51:53)
- 6 (2017-03-29 (水) 13:57:38)
- 7 (2017-10-11 (水) 16:12:27)
- 8 (2017-11-24 (金) 17:58:51)
- 9 (2018-02-15 (木) 14:23:42)
- 10 (2018-02-24 (土) 19:52:42)
- 11 (2019-02-13 (水) 16:32:32)
- 12 (2019-12-24 (火) 20:36:56)
- 13 (2021-06-25 (金) 22:30:02)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: FilterListItems title: JListのアイテムをフィルタリングして表示 tags: [JList, ListCellRenderer, Pattern] author: aterai pubdate: 2016-09-05T00:18:48+09:00 description: JListのアイテムのタイトル文字列に対して、正規表現による表示フィルタリングを実行します。 image: https://drive.google.com/uc?export=view&id=1po5ebXxijKnGitb-gGFQv-USKEVDS9IaBQ hreflang: href: https://java-swing-tips.blogspot.jp/2016/11/filtering-jlist-items-by-regex.html lang: en --- * 概要 [#summary] `JList`のアイテムのタイトル文字列に対して、正規表現による表示フィルタリングを実行します。 #download(https://drive.google.com/uc?export=view&id=1po5ebXxijKnGitb-gGFQv-USKEVDS9IaBQ) * サンプルコード [#sourcecode] #code(link){{ DefaultListModel<ListItem> model = new DefaultListModel<>(); JList<ListItem> list = new JList<ListItem>(model) { @Override public void updateUI() { setSelectionForeground(null); setSelectionBackground(null); setCellRenderer(null); super.updateUI(); setLayoutOrientation(JList.HORIZONTAL_WRAP); setVisibleRowCount(0); setFixedCellWidth(82); setFixedCellHeight(64); setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10)); setCellRenderer(new ListItemListCellRenderer<ListItem>()); getSelectionModel().setSelectionMode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); } }; private Optional<Pattern> getPattern() { try { return Optional.ofNullable(field.getText()) .filter(s -> !s.isEmpty()) .map(Pattern::compile); } catch (PatternSyntaxException ex) { return Optional.empty(); } } private void filter() { getPattern().ifPresent(pattern -> { List<ListItem> selected = list.getSelectedValuesList(); model.clear(); Stream.of(defaultModel) .filter(item -> pattern.matcher(item.title).find()) .forEach(model::addElement); for (ListItem item : selected) { int i = model.indexOf(item); list.addSelectionInterval(i, i); } }); } }} * 解説 [#explanation] 上記のサンプルでは、水平[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JList.html#HORIZONTAL_WRAP ニュースペーパー・スタイル]レイアウトに設定した`JList`で、アイテム(セル)のタイトル文字列が`JTextField`に入力したパターンにマッチするかどうかによる表示のフィルタリングを行っています。 ---- - `JList`デフォルトのセルを垂直方向に`1`列に並べたレイアウトで、フィルタリングを行う場合は、ヘッダを非表示にした`JTable`と`RowFilter`で代用できる - メモ: -- `JList`デフォルトのセルを垂直方向に`1`列に並べたレイアウトでフィルタリングを行う場合は、ヘッダを非表示にした`JTable`と`RowFilter`で代用可能 //* 参考リンク [#reference] * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JList.html#HORIZONTAL_WRAP JList#HORIZONTAL_WRAP (Java Platform SE 8)] * コメント [#comment] #comment #comment