Swing/HighlightSearch のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/HighlightSearch へ行く。
- 1 (2014-07-23 (水) 17:57:58)
- 2 (2014-11-05 (水) 05:09:49)
- 3 (2014-11-10 (月) 00:02:43)
- 4 (2014-11-18 (火) 16:23:07)
- 5 (2014-11-21 (金) 18:11:05)
- 6 (2015-02-16 (月) 15:27:25)
- 7 (2015-07-27 (月) 18:57:13)
- 8 (2015-12-01 (火) 17:01:54)
- 9 (2016-11-18 (金) 14:43:05)
- 10 (2017-03-30 (木) 14:16:46)
- 11 (2018-02-24 (土) 19:51:30)
- 12 (2018-03-01 (木) 14:51:41)
- 13 (2019-04-09 (火) 20:11:04)
- 14 (2021-01-20 (水) 18:21:50)
- 15 (2023-07-28 (金) 17:13:01)
- title: JTextAreaでハイライト付き検索を行う tags: [JTextArea, JTextField, JLayer, Highlighter, Matcher, Pattern] author: aterai pubdate: 2014-07-07T00:34:07+09:00 description: JTextArea内の文字列を指定した条件で検索し、マッチした文字列をすべてハイライト表示します。
概要
JTextArea
内の文字列を指定した条件で検索し、マッチした文字列をすべてハイライト表示します。
Screenshot
Advertisement
サンプルコード
private Pattern getPattern() {
String text = field.getText();
if (text == null || text.isEmpty()) {
return null;
}
try {
String cw = checkWord.isSelected() ? "\\b" : "";
String pattern = String.format("%s%s%s", cw, text, cw);
int flags = checkCase.isSelected()
? 0 : Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE;
return Pattern.compile(pattern, flags);
} catch (PatternSyntaxException ex) {
field.setBackground(WARNING_COLOR);
return null;
}
}
private void changeHighlight() {
field.setBackground(Color.WHITE);
Highlighter highlighter = textArea.getHighlighter();
highlighter.removeAllHighlights();
Document doc = textArea.getDocument();
try {
Pattern pattern = getPattern();
if (pattern != null) {
Matcher matcher = pattern.matcher(doc.getText(0, doc.getLength()));
int pos = 0;
while (matcher.find(pos)) {
int start = matcher.start();
int end = matcher.end();
highlighter.addHighlight(start, end, highlightPainter);
pos = end;
}
}
JLabel label = layerUI.hint;
Highlighter.Highlight[] array = highlighter.getHighlights();
int hits = array.length;
if (hits == 0) {
current = -1;
label.setOpaque(true);
} else {
current = (current + hits) % hits;
label.setOpaque(false);
Highlighter.Highlight hh = highlighter.getHighlights()[current];
highlighter.removeHighlight(hh);
highlighter.addHighlight(
hh.getStartOffset(), hh.getEndOffset(), currentPainter);
scrollToCenter(textArea, hh.getStartOffset());
}
label.setText(String.format("%02d / %02d%n", current + 1, hits));
} catch (BadLocationException e) {
e.printStackTrace();
}
field.repaint();
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、以下のような条件に一致する文字列をすべてハイライト表示(黄色)する検索を行います。また、文字列入力欄に文字列が入力されている場合、マッチした結果の総数とカレントの結果(オレンジでハイライト)の順番をJLayer
で表示します。
⋀
- 前を検索
⋁
- 次を検索
"Match case"
- チェック有りで、
Pattern.compile(...)
の引数に、0
を指定して大文字小文字の区別を行う - チェック無しで、
Pattern.compile(...)
の引数に、Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE
を指定して、大文字小文字の区別をしない
- チェック有りで、
"Match whole word only"
- チェック有りで、
\b
(単語境界)を検索文字列の前後に追加して、単語検索を行う
- チェック有りで、
参考リンク
- JTextPaneで検索結果のハイライト表示と文字色変更を同時に行う?