JTableの検索結果をRowFilterとHighlighterで強調表示する
Total: 6011
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTable
で正規表現による検索結果をRowFilter
とHighlighter
を使用して表現します。
Screenshot
Advertisement
サンプルコード
class HighlightTableCellRenderer
extends JTextField implements TableCellRenderer {
private static final Color BGC= 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 ? BGC : Color.WHITE);
if (pattern != null && !pattern.isEmpty() && !pattern.equals(prev)) {
Matcher matcher = Pattern.compile(pattern).matcher(txt);
int pos = 0;
while (matcher.find(pos) && !matcher.group().isEmpty()) {
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)
で正規表現を使用するフィルタを作成し、その検索にマッチする行以外は非表示