TITLE:Highlighterで文字列をハイライト

Posted by terai at 2005-12-05

Highlighterで文字列をハイライト

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

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

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) {}
}

解説

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

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

参考リンク

コメント

  • こんにちは。はじめまして。Keithと言います。このプログラムだと、テキスト中の複数の異なる文字に、それぞれハイライトを割り当てることが出来ないのですが、解決策はあるでしょうか。 -- Keith
    • こんばんは。Highlighter#addHighlightメソッドは、複数のハイライトを追加できるので、パターン毎に色を変えたいだけなら(効率とか、同じ文字列が含まれる場合とか、エラー処理などの面倒なことは考えない)、以下のようにパターンを配列にして繰り返すだけでもいいかもしれません。 -- terai
      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(); }
      }
      
  • こんな簡単にハイライトできるとは!。正規表現で実装すると開始位置と終了位置がより簡単で、しかも複雑にできるかも。 -- eternalharvest
    • ちょっと夏休みで帰省してました。正規表現 > そうですね。基本的には同じような要領で大丈夫だと思います。メモ:Swing - Content-Overlay in JTextPane -- terai