Swing/TableHighlightRegexFilter のバックアップ(No.9)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TableHighlightRegexFilter へ行く。
  - 1 (2013-07-29 (月) 00:24:19)
- 2 (2013-10-08 (火) 15:10:05)
- 3 (2014-06-12 (木) 21:32:31)
- 4 (2014-06-29 (日) 06:46:50)
- 5 (2014-10-27 (月) 16:04:06)
- 6 (2014-11-22 (土) 04:00:54)
- 7 (2015-12-22 (火) 00:38:22)
- 8 (2017-06-09 (金) 13:14:11)
- 9 (2017-11-13 (月) 15:27:42)
- 10 (2017-11-16 (木) 12:59:31)
- 11 (2018-02-24 (土) 19:51:30)
- 12 (2019-04-09 (火) 20:12:46)
- 13 (2021-01-28 (木) 02:10:18)
- 14 (2023-12-24 (日) 15:28:53)
- 15 (2025-01-03 (金) 08:57:02)
- 16 (2025-01-03 (金) 09:01:23)
- 17 (2025-01-03 (金) 09:02:38)
- 18 (2025-01-03 (金) 09:03:21)
- 19 (2025-01-03 (金) 09:04:02)
- 20 (2025-06-19 (木) 12:41:37)
- 21 (2025-06-19 (木) 12:43:47)
 
- category: swing
folder: TableHighlightRegexFilter
title: JTableの検索結果をRowFilterとHighlighterで強調表示する
tags: [JTable, RowFilter, TableRowSorter, Highlighter, TableCellRenderer, JTextField, Pattern, Matcher]
author: aterai
pubdate: 2013-07-29T00:24:19+09:00
description: JTableで正規表現による検索結果をRowFilterとHighlighterを使用して表現します。
image:  hreflang: hreflang:href: http://java-swing-tips.blogspot.com/2013/07/jtable-highlighting-and-filtering-with.html lang: en 
概要
JTableで正規表現による検索結果をRowFilterとHighlighterを使用して表現します。
Screenshot

Advertisement
サンプルコード
class HighlightTableCellRenderer extends JTextField implements TableCellRenderer {
  private static final Color BACKGROUND_SELECTION_COLOR = new Color(220, 240, 255);
  private final transient Highlighter.HighlightPainter highlightPainter
    = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
  private String pattern = "";
  private String prev;
  public boolean setPattern(String str) {
    if (str == null || str.equals(pattern)) {
      return false;
    } else {
      prev = pattern;
      pattern = str;
      return true;
    }
  }
  public HighlightTableCellRenderer() {
    super();
    setOpaque(true);
    setBorder(BorderFactory.createEmptyBorder());
    setForeground(Color.BLACK);
    setBackground(Color.WHITE);
    setEditable(false);
  }
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    String txt = Objects.toString(value, "");
    Highlighter highlighter = getHighlighter();
    highlighter.removeAllHighlights();
    setText(txt);
    setBackground(isSelected ? BACKGROUND_SELECTION_COLOR : Color.WHITE);
    if (pattern != null && !pattern.isEmpty() && !pattern.equals(prev)) {
      Matcher matcher = Pattern.compile(pattern).matcher(txt);
      int pos = 0;
      while (matcher.find(pos)) {
        int start = matcher.start();
        int end   = matcher.end();
        try {
          highlighter.addHighlight(start, end, highlightPainter);
        } catch (BadLocationException | PatternSyntaxException e) {
          e.printStackTrace();
        }
        pos = end;
      }
    }
    return this;
  }
}
解説
- セル中文字列のハイライト
- 参考: JTreeのノード中の文字列をハイライトする
- JTextFieldを継承する- TableCellRendererを作成し、- JTextField#getHighlighter()#addHighlight(...)メソッドで検索結果をハイライト表示
 
- 行のフィルタリング
- 参考: RowFilterでJTableの行をフィルタリング
- RowFilter.regexFilter(pattern)で正規表現を使用するフィルタを作成し、その検索にマッチする行以外は非表示