Swing/Highlighter のバックアップの現在との差分(No.5)
TITLE:Highlighterで文字列をハイライト
Highlighterで文字列をハイライト
編集者:Terai Atsuhiro~
作成日:2005-12-05
更新日:2023-12-31 (日) 19:27:47
概要
Highlighter
を使ってテキスト中の文字列を強調表示します。
Screenshot
Advertisement
概要
Highlighterを使ってテキスト中の文字列を強調表示します。サンプルコード
#spanend
#spanadd
jtc.getHighlighter().removeAllHighlights();
#spanend
#spanadd
try {
#spanend
Highlighter highlighter = jtc.getHighlighter();
Document doc = jtc.getDocument();
String text = doc.getText(0, doc.getLength());
Matcher matcher = Pattern.compile(pattern).matcher(text);
int pos = 0;
while (matcher.find(pos) && !matcher.group().isEmpty()) {
pos = matcher.end();
highlighter.addHighlight(matcher.start(), pos, highlightPainter);
}
#spanadd
} catch (BadLocationException | PatternSyntaxException ex) {
#spanend
ex.printStackTrace();
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin#screenshot
解説
- テキストコンポーネントから
Highlighter
を取得し、Highlighter#addHighlight(...)
メソッドで検索した文字列を追加 - 上記のサンプルではハイライト色を
DefaultHighlighter.DefaultHighlightPainter
を使用して設定
サンプルコード
参考リンク
- Highlighter#addHighlight(...) (Java Platform SE 8)
- Swing - Searching text in files & highlighting that text
- JTextPaneで検索結果のハイライト表示と文字色変更を同時に行う
コメント
- こんにちは。はじめまして。Keithと言います。このプログラムだと、テキスト中の複数の異なる文字に、それぞれハイライトを割り当てることが出来ないのですが、解決策はあるでしょうか。 -- Keith
- こんばんは。
Highlighter#addHighlight
メソッドは、複数のハイライトを追加できるので、パターン毎に色を変えたいだけなら(効率とか、同じ文字列が含まれる場合とか、エラー処理などの面倒なことは考えない)、以下のようにパターンを配列にして繰り返すだけでもいいかもしれません。 -- aterai
- こんばんは。
public void setHighlight(JTextComponent jtc, String pattern) {
removeHighlights(jtc);
try{
Highlighter hilite = jtc.getHighlighter();
Document doc = jtc.getDocument();
String text = doc.getText(0, doc.getLength());
int pos = 0;
while((pos = text.indexOf(pattern, pos)) >= 0) {
hilite.addHighlight(pos, pos+pattern.length(), highlightPainter);
pos += pattern.length();
}
}catch(BadLocationException e) {}
}
#spanadd
private final Highlighter.HighlightPainter[] highlightPainter = {
#spanend
new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW),
new DefaultHighlighter.DefaultHighlightPainter(Color.CYAN)
#spanadd
};
#spanend
#spanadd
private final String[] pattern = {"Swing", "win"};
#spanend
#spanadd
public void setHighlight(JTextComponent jtc, String[] pattern) {
#spanend
try {
Highlighter hilite = jtc.getHighlighter();
hilite.removeAllHighlights();
Document doc = jtc.getDocument();
String text = doc.getText(0, doc.getLength());
for (int i = 0; i < pattern.length; i++) {
int pos = 0;
while ((pos = text.indexOf(pattern[i], pos)) >= 0) {
hilite.addHighlight(pos, pos + pattern[i].length(), highlightPainter[i]);
pos += pattern[i].length();
}
}
} catch (BadLocationException e) {
e.printStackTrace();
}
#spanadd
}
#spanend
- &jnlp;
- &jar;
- &zip;
解説
テキストコンポーネントからHighlighterを取得し、Highlighter#addHighlightメソッドで検索した文字列を追加していきます。- こんな簡単にハイライトできるとは!。正規表現で実装すると開始位置と終了位置がより簡単で、しかも複雑にできるかも。 -- eternalharvest
- ちょっと夏休みで帰省してました。正規表現 > そうですね。基本的には同じような要領で大丈夫だと思います。メモ: Swing - Content-Overlay in JTextPane、追記: DefaultHighlighterの描画方法を変更するに、
Matcher matcher = Pattern.compile(pattern).matcher(text);
と正規表現でハイライトするサンプルを追加。追記2: このサンプルでも正規表現を使用するように変更。 -- aterai
- ちょっと夏休みで帰省してました。正規表現 > そうですね。基本的には同じような要領で大丈夫だと思います。メモ: Swing - Content-Overlay in JTextPane、追記: DefaultHighlighterの描画方法を変更するに、
- こんにちは。Cakaiと申します。ハイライトされているテキストのカラーを設定することがありますか? -- Caokai
- こんにちは。はじめまして。
Highlighter.HighlightPainter
で、文字色は変更できないかもしれません。以下のようにAttributeSet
を使うのはどうでしょう。JTextPaneでキーワードのSyntaxHighlight -- aterai- 用途によっては、JEditorPaneのHTMLEditorKitにCSSを適用なども使えるかもしれません。 -- aterai
- JTextPaneで検索結果のハイライト表示と文字色変更を同時に行うにサンプルコードを移動。 -- aterai
- こんにちは。はじめまして。
- わかりました。ほんとにありがとうございました。 -- Caokai