Swing/TableHighlightRegexFilter のバックアップ(No.8)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- 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:
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;
}
}
View in GitHub: Java, Kotlin解説
- セル中文字列のハイライト
- JTreeのノード中の文字列をハイライトする
JTextField
を継承するTableCellRenderer
を作成し、JTextField#getHighlighter()#addHighlight(...)
で検索結果をハイライトして表示
- 行のフィルタリング
- RowFilterでJTableの行をフィルタリング
RowFilter.regexFilter(pattern)
で正規表現を使用するフィルタを作成し、その検索にマッチする行以外は非表示