Swing/TreeNodeHighlightSearch のバックアップの現在との差分(No.1)
TITLE:JTreeで条件に一致するノードを検索しハイライト
Posted by terai at 2010-10-18
JTreeで条件に一致するノードを検索しハイライト
JTreeを検索し、TreeCellRendererを使ってノードをハイライトします。-
category: swing
folder: TreeNodeHighlightSearch
title: JTreeで条件に一致するノードを検索しハイライト
tags: [JTree, TreeCellRenderer]
author: aterai
pubdate: 2010-10-18T14:37:59+09:00
description: JTreeを検索し、TreeCellRendererを使ってノードをハイライトします。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2010/10/jtree-node-highlight-search.html lang: en
概要
JTree
を検索し、TreeCellRenderer
を使ってノードをハイライトします。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
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;
}
public Component getTreeCellRendererComponent(JTree tree, Object value,
#spanadd
#spanend
@Override public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean isSelected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
JComponent c = (JComponent)renderer.getTreeCellRendererComponent(
JComponent c = (JComponent) renderer.getTreeCellRendererComponent(
tree, value, isSelected, expanded, leaf, row, hasFocus);
if(isSelected) {
if (isSelected) {
c.setOpaque(false);
c.setForeground(getTextSelectionColor());
//c.setBackground(Color.BLUE); //getBackgroundSelectionColor());
}else{
// c.setBackground(Color.BLUE); // getBackgroundSelectionColor());
} else {
c.setOpaque(true);
if(q!=null && !q.isEmpty() && value.toString().startsWith(q)) {
if (q != null && !q.isEmpty() && value.toString().startsWith(q)) {
c.setForeground(getTextNonSelectionColor());
c.setBackground(rollOverRowColor);
}else{
} else {
c.setForeground(getTextNonSelectionColor());
c.setBackground(getBackgroundNonSelectionColor());
}
}
return c;
}
}
解説
JTextFieldに入力した文字列にstartsWith(...)で一致するノードをハイライトしています。デフォルトのTreeCellRendererは、isOpaque()==Boolean.FALSE で、選択色はDefaultTreeCellRenderer#paint(Graphics g)で塗りつぶされる*1ので、検索のハイライトの為にレンダラーをsetOpaque(true)としてしまうと、マウスなどでノードを選択しても背景色が変更されません。このため、上記のサンプルでは、DefaultTreeCellRenderer#getTreeCellRendererComponent(...)内で、検索のハイライトはレンダラーをsetOpaque(true)、ノードの選択はsetOpaque(false)となるように設定しています。解説
上記のサンプルでは、JTextField
に入力した文字列にstartsWith(...)
で一致するノードをハイライトしています。
参考リンク
- JTreeのノードを検索する?
- JTreeのノードを展開・折り畳み
- JTreeのノードをハイライト
- デフォルトの
TreeCellRenderer
はisOpaque() == Boolean.FALSE
- 選択状態の背景色は
DefaultTreeCellRenderer#paint(Graphics g)
で塗りつぶされるので、検索のハイライトの為にレンダラーをsetOpaque(true)
としてしまうとマウスなどでノードを選択しても背景色が変更されない -
DefaultTreeCellRenderer#getTreeCellRendererComponent(...)
内で検索のハイライトはレンダラーをsetOpaque(true)
、ノードの選択はsetOpaque(false)
となるように設定
- 選択状態の背景色は
-
DefaultTreeCellRenderer#getBackgroundNonSelectionColor()
をオーバーライドすればデフォルト選択領域の選択色を変更可能(ノードアイコンは含まず、ノードテキストのみ)
コメント
参考リンク
- JTreeのノードを検索する
- JTreeのノードを展開・折り畳み
- JTreeのノードをハイライト
- JTreeの選択背景色を変更
- JTreeのノード中の文字列をハイライトする
- ノードではなく一致する文字列だけをハイライトして強調表示する場合のサンプル