TITLE:JTreeのノード中の文字列をハイライトする
#navi(../)
#tags(JTree, TreeCellRenderer, JTextField, HighlightPainter)
RIGHT:Posted by &author(aterai); at 2013-07-01
*JTreeのノード中の文字列をハイライトする [#re290e8f]
``JTree``のノードから文字列を検索して、``HighlightPainter``で強調表示します。

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

//#screenshot
#ref()

**サンプルコード [#c24b12df]
#code(link){{
class HighlightTreeCellRenderer extends JTextField
                                implements TreeCellRenderer {
  Color backgroundSelectionColor = new Color(220, 240, 255);
  Highlighter.HighlightPainter highlightPainter =
    new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
  public String q;
  public HighlightTreeCellRenderer() {
    super();
    setOpaque(true);
    setBorder(BorderFactory.createEmptyBorder());
    setForeground(Color.BLACK);
    setBackground(Color.WHITE);
    setEditable(false);
  }
  public void removeHighlights() {
    Highlighter highlighter = getHighlighter();
    for(Highlighter.Highlight h: highlighter.getHighlights()) {
      highlighter.removeHighlight(h);
    }
  }
  @Override public Component getTreeCellRendererComponent(
      JTree tree, Object value, boolean isSelected, boolean expanded,
      boolean leaf, int row, boolean hasFocus) {
    String txt = value!=null ? value.toString() : "";
    removeHighlights();
    setText(txt);
    setBackground(isSelected ? backgroundSelectionColor : Color.WHITE);
    if(q!=null && !q.isEmpty() && txt.startsWith(q)) {
      try {
        getHighlighter().addHighlight(0, q.length(), highlightPainter);
      } catch(BadLocationException e) {
        e.printStackTrace();
      }
    }
    return this;
  }
}
}}

**解説 [#d110ee6b]
上記のサンプルでは、``TreeCellRenderer``に``JLabel``ではなく、``JTextField``を使用し``JTextField#getHighlighter()#addHighlight(...)``で検索中の文字列をハイライト表示しています。

**参考リンク [#g34180a0]
- [[JTreeで条件に一致するノードを検索しハイライト>Swing/TreeNodeHighlightSearch]]
-- こちらは、ノードの色を変更してハイライト表示
- [[Highlighterで文字列をハイライト>Swing/Highlighter]]

**コメント [#y9b737b4]
#comment