概要

JListのアイテムのタイトル文字列に対して、正規表現による表示フィルタリングを実行します。

サンプルコード

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);
  }
};
#spanadd

#spanend
#spanadd
private Optional<Pattern> getPattern() {
#spanend
  try {
    return Optional.ofNullable(field.getText())
        .filter(s -> !s.isEmpty()).map(Pattern::compile);
  } catch (PatternSyntaxException ex) {
    return Optional.empty();
  }
#spanadd
}
#spanend
#spanadd

#spanend
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);
      }
    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);
    }
  });
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、ニュースペーパー・スタイルレイアウトに設定したJListで、アイテム(セル)のタイトル文字列がJTextFieldに入力したパターンにマッチするかどうかによる表示のフィルタリングを行っています。 上記のサンプルでは、水平ニュースペーパー・スタイルレイアウトを設定したJListで、アイテム(セル)のタイトル文字列がJTextFieldに入力したパターンにマッチするかどうかによる表示のフィルタリングを行っています。
  • -
  • JListデフォルトのセルを垂直方向に1列に並べたレイアウトで、フィルタリングを行う場合は、ヘッダを非表示にしたJTableRowFilterで代用することが可能
  • JListデフォルトのセルを垂直方向に1列に並べたレイアウトでフィルタリングを行う場合は、ヘッダを非表示にしたJTableRowFilterで代用可能

参考リンク

コメント