• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:Highlighterで文字列をハイライト
#navi(../)
*Highlighterで文字列をハイライト [#e299b873]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-12-05~
更新日:&lastmod;
Posted by [[terai]] at 2005-12-05

#contents

**概要 [#l11a7970]
Highlighterを使ってテキスト中の文字列を強調表示します。

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#l4fc3b9f]
#code{{
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) {}
}
}}
-&jnlp;
-&jar;
-&zip;

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

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

**参考リンク [#ncf1589c]
-[[Searching text in files & highlighting that text>http://forum.java.sun.com/thread.jspa?threadID=641649]]
-[[Swing - Searching text in files & highlighting that text>http://forums.sun.com/thread.jspa?threadID=641649]]

**コメント [#z9e32e25]
- こんにちは。はじめまして。Keithと言います。このプログラムだと、テキスト中の複数の異なる文字に、それぞれハイライトを割り当てることが出来ないのですが、解決策はあるでしょうか。 -- [[Keith]] &new{2007-11-28 (水) 19:12:19};
-- こんばんは。Highlighter#addHighlightメソッドは、複数のハイライトを追加できるので、パターン毎に色を変えたいだけなら(効率とか、同じ文字列が含まれる場合とか、エラー処理などの面倒なことは考えない)、以下のようにパターンを配列にして繰り返すだけでもいいかもしれません。 -- [[terai]] &new{2007-11-28 (水) 20:25:31};
#code{{
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) {
  removeHighlights(jtc);
  try{
    Highlighter hilite = jtc.getHighlighter();
    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(); }
}
}}

#comment