Swing/TreeNodeHighlightSearch のバックアップソース(No.11)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/TreeNodeHighlightSearch へ行く。
- 1 (2010-10-18 (月) 14:37:59)
- 2 (2012-10-18 (木) 21:23:22)
- 3 (2012-10-29 (月) 01:13:22)
- 4 (2012-12-26 (水) 06:37:10)
- 5 (2013-07-01 (月) 00:04:31)
- 6 (2013-10-03 (木) 14:42:38)
- 7 (2013-10-18 (金) 15:59:10)
- 8 (2014-12-02 (火) 01:52:33)
- 9 (2016-02-23 (火) 14:22:57)
- 10 (2017-03-28 (火) 15:34:05)
- 11 (2018-01-28 (日) 18:47:43)
- 12 (2018-02-24 (土) 19:51:30)
- 13 (2020-01-25 (土) 17:06:58)
- 14 (2021-07-22 (木) 22:11:08)
--- category: swing folder: TreeNodeHighlightSearch title: JTreeで条件に一致するノードを検索しハイライト tags: [JTree, TreeCellRenderer] author: aterai pubdate: 2010-10-18T14:37:59+09:00 description: JTreeを検索し、TreeCellRendererを使ってノードをハイライトします。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTWIqTzfbI/AAAAAAAAAow/n7eIy_ax-zY/s800/TreeNodeHighlightSearch.png hreflang: href: http://java-swing-tips.blogspot.com/2010/10/jtree-node-highlight-search.html lang: en --- * 概要 [#summary] `JTree`を検索し、`TreeCellRenderer`を使ってノードをハイライトします。 #download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTWIqTzfbI/AAAAAAAAAow/n7eIy_ax-zY/s800/TreeNodeHighlightSearch.png) * サンプルコード [#sourcecode] #code(link){{ class HighlightTreeCellRenderer extends DefaultTreeCellRenderer { private static final Color rollOverRowColor = new Color(220, 240, 255); private final TreeCellRenderer renderer; public String q; public HighlightTreeCellRenderer(TreeCellRenderer renderer) { this.renderer = renderer; } @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row, boolean hasFocus) { JComponent c = (JComponent) renderer.getTreeCellRendererComponent( tree, value, isSelected, expanded, leaf, row, hasFocus); if (isSelected) { c.setOpaque(false); c.setForeground(getTextSelectionColor()); //c.setBackground(Color.BLUE); //getBackgroundSelectionColor()); } else { c.setOpaque(true); if (q != null && !q.isEmpty() && value.toString().startsWith(q)) { c.setForeground(getTextNonSelectionColor()); c.setBackground(rollOverRowColor); } else { c.setForeground(getTextNonSelectionColor()); c.setBackground(getBackgroundNonSelectionColor()); } } return c; } } }} * 解説 [#explanation] 上記のサンプルでは、`JTextField`に入力した文字列に`startsWith(...)`で一致するノードをハイライトしています。デフォルトの`TreeCellRenderer`は、`isOpaque()==Boolean.FALSE`で、選択色は`DefaultTreeCellRenderer#paint(Graphics g)`で塗りつぶされる(ノードアイコンを除いて選択状態にするため?)ので、検索のハイライトの為にレンダラーを`setOpaque(true)`としてしまうと、マウスなどでノードを選択しても背景色が変更されません。このため、`DefaultTreeCellRenderer#getTreeCellRendererComponent(...)`内で、検索のハイライトはレンダラーを`setOpaque(true)`、ノードの選択は`setOpaque(false)`となるように設定しています。 ---- - `DefaultTreeCellRenderer#getBackgroundNonSelectionColor()`をオーバーライドすれば、デフォルト選択領域の選択色を変更できる(ノードアイコンは含まず、ノードテキストのみ) -- [[JTreeの選択背景色を変更>Swing/TreeBackgroundSelectionColor]]に移動 * 参考リンク [#reference] - [[JTreeのノードを検索する>Swing/SearchBox]] - [[JTreeのノードを展開・折り畳み>Swing/ExpandAllNodes]] - [[JTreeのノードをハイライト>Swing/RollOverTree]] - [[JTreeの選択背景色を変更>Swing/TreeBackgroundSelectionColor]] - [[JTreeのノード中の文字列をハイライトする>Swing/HighlightWordInNode]] -- ノードではなく一致する文字列だけをハイライトして強調表示する場合のサンプル * コメント [#comment] #comment #comment