概要

Highlighterを使ってテキスト中の文字列を強調表示します。

サンプルコード

jtc.getHighlighter().removeAllHighlights();
try {
  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)) {
    pos = matcher.end();
    highlighter.addHighlight(matcher.start(), pos, highlightPainter);
  }
} catch (BadLocationException | PatternSyntaxException ex) {
  ex.printStackTrace();
}
view all

解説

テキストコンポーネントからHighlighterを取得し、Highlighter#addHighlightメソッドで検索した文字列を追加していきます。

上記のサンプルでは、ハイライト色をDefaultHighlighter.DefaultHighlightPainterを使って指定しています。

参考リンク

コメント

  • こんにちは。はじめまして。Keithと言います。このプログラムだと、テキスト中の複数の異なる文字に、それぞれハイライトを割り当てることが出来ないのですが、解決策はあるでしょうか。 -- Keith
    • こんばんは。Highlighter#addHighlightメソッドは、複数のハイライトを追加できるので、パターン毎に色を変えたいだけなら(効率とか、同じ文字列が含まれる場合とか、エラー処理などの面倒なことは考えない)、以下のようにパターンを配列にして繰り返すだけでもいいかもしれません。 -- aterai
private final Highlighter.HighlightPainter[] highlightPainter = {
  new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW),
  new DefaultHighlighter.DefaultHighlightPainter(Color.CYAN)
};
private final String[] pattern = {"Swing", "win"};
public void setHighlight(JTextComponent jtc, String[] pattern) {
  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();
  }
}
  • こんな簡単にハイライトできるとは!。正規表現で実装すると開始位置と終了位置がより簡単で、しかも複雑にできるかも。 -- eternalharvest
    • ちょっと夏休みで帰省してました。正規表現 > そうですね。基本的には同じような要領で大丈夫だと思います。メモ: Swing - Content-Overlay in JTextPane、追記: DefaultHighlighterの描画方法を変更するに、Matcher matcher = Pattern.compile(pattern).matcher(text);と正規表現でハイライトするサンプルを追加。追記2: このサンプルでも正規表現を使用するように変更。 -- aterai
  • こんにちは。Cakaiと申します。ハイライトされているテキストのカラーを設定することがありますか? -- Caokai
  • わかりました。ほんとにありがとうございました。 -- Caokai