Swing/HighlightSearch のバックアップ差分(No.11)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - 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)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: HighlightSearch title: JTextAreaでハイライト付き検索を行う tags: [JTextArea, JTextField, JLayer, Highlighter, Matcher, Pattern] author: aterai pubdate: 2014-07-07T00:34:07+09:00 description: JTextArea内の文字列を指定した条件で検索し、マッチした文字列をすべてハイライト表示します。 image: https://lh5.googleusercontent.com/-jdjIr-6A1l8/U7ljpxPgxzI/AAAAAAAACJI/x2Okpzkcce8/s800/HighlightSearch.png hreflang: href: http://java-swing-tips.blogspot.com/2014/07/highlight-all-search-pattern-matches-in.html lang: en --- * 概要 [#summary] `JTextArea`内の文字列を指定した条件で検索し、マッチした文字列をすべてハイライト表示します。 #download(https://lh5.googleusercontent.com/-jdjIr-6A1l8/U7ljpxPgxzI/AAAAAAAACJI/x2Okpzkcce8/s800/HighlightSearch.png) * サンプルコード [#sourcecode] #code(link){{ 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(); } }} * 解説 [#explanation] 上記のサンプルでは、以下のような条件に一致する文字列をすべてハイライト表示(黄色)する検索を行います。また、文字列入力欄に文字列が入力されている場合、マッチした結果の総数とカレントの結果(オレンジでハイライト)の順番を`JLayer`で表示します。 - `⋀` -- 先頭に向かって検索 - `⋁` -- 末尾に向かって検索 - `Match case` -- チェック有りで、`Pattern.compile(...)`の引数に、`0`を指定して大文字小文字の区別を行う -- チェック無しで、`Pattern.compile(...)`の引数に、`Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE`を指定して、大文字小文字の区別をしない - `Match whole word only` -- チェック有りで、`\b`(単語境界)を検索文字列の前後に追加して、単語検索を行う * 参考リンク [#reference] - [[JTextPaneで検索結果のハイライト表示と文字色変更を同時に行う>Swing/HighlightTextForeground]] * コメント [#comment] #comment - `Match case`の動作が逆になっていたのを修正。 -- &user(aterai); &new{2014-07-23 (水) 17:57:58}; - 参考リンクのリンク先が`404`だったのを修正。 -- &user(aterai); &new{2015-07-27 (水) 17:57:58}; - 参考リンクのリンク先が`404`になっていたのを修正。 -- &user(aterai); &new{2015-07-27 (水) 17:57:58}; #comment