---
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
---
* 概要 [#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 void filter() {
  getPattern().ifPresent(pattern -> {
    for (ListItem item : defaultModel) {
      if (pattern.matcher(item.title).find()) {
        if (!model.contains(item)) {
          model.addElement(item);
        }
      } else {
        model.removeElement(item);
      }
    }
  });
}
}}

* 解説 [#explanation]
上記のサンプルでは、ニュースペーパー・スタイルレイアウトに設定した`JList`で、アイテム(セル)のタイトル文字列が`JTextField`に入力したパターンにマッチするかどうかによる表示のフィルタリングを行っています。

----
- `JList`デフォルトのセルを垂直方向に`1`列に並べたレイアウトで、フィルタリングを行う場合は、ヘッダを非表示にした`JTable`と`RowFilter`で代用することが可能

//* 参考リンク [#reference]
* コメント [#comment]
#comment
#comment