Swing/TreeNodeFilter のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TreeNodeFilter へ行く。
- 1 (2016-08-01 (月) 20:30:57)
- 2 (2017-04-07 (金) 13:51:51)
- 3 (2017-09-28 (木) 15:04:23)
- 4 (2019-04-03 (水) 19:30:54)
- 5 (2021-01-14 (木) 18:00:18)
- 6 (2023-07-12 (水) 17:13:26)
- 7 (2025-01-03 (金) 08:57:02)
- 8 (2025-01-03 (金) 09:01:23)
- 9 (2025-01-03 (金) 09:02:38)
- 10 (2025-01-03 (金) 09:03:21)
- 11 (2025-01-03 (金) 09:04:02)
- category: swing
folder: TreeNodeFilter
title: JTreeのノードを名前で検索して表示のフィルタリングを行う
tags: [JTree, TreePath, TreeCellRenderer, DefaultMutableTreeNode]
author: aterai
pubdate: 2016-08-01T03:05:47+09:00
description: JTreeのノードを検索し、そのTreePathが条件に一致しないノードを非表示にするフィルタリングを行います。
image:
概要
JTree
のノードを検索し、そのTreePath
が条件に一致しないノードを非表示にするフィルタリングを行います。
Screenshot

Advertisement
サンプルコード
tree.setCellRenderer(new DefaultTreeCellRenderer() {
private final JLabel emptyLabel = new JLabel();
@Override public Component getTreeCellRendererComponent(
JTree tree, Object value, boolean selected, boolean expanded, boolean leaf,
int row, boolean hasFocus) {
Component c = super.getTreeCellRendererComponent(
tree, value, selected, expanded, leaf, row, hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
FilterableNode uo = (FilterableNode) node.getUserObject();
return uo.status ? c : emptyLabel;
}
});
fireDocumentChangeEvent();
//...
private void fireDocumentChangeEvent() {
String q = field.getText();
TreePath rtp = tree.getPathForRow(0);
if (q.isEmpty()) {
resetAll(tree, rtp, true);
((DefaultTreeModel) tree.getModel()).reload();
//visitAll(tree, rtp, true);
} else {
visitAll(tree, rtp, false);
searchTree(tree, rtp, q);
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、指定された条件に一致しないノードを高さ0
のTreeCellRenderer
で描画することで、ノードのフィルタリングを行っています。
TreePath
に指定された接頭辞で始まるTreeNode
が含まれている場合、そのノードのUserObject
に表示フラグを立てる- 例:
foo
で検索した場合、food
ノード以下の子ノードも表示される
- 例:
TreeCellRenderer
で、UserObject
を取得し、非表示の場合は高さ0
のJLabel
をレンダラーとして返すtree.setRowHeight(-1);
と設定しているので、各ノードの推奨サイズが行の高さとして使用される
- 高さ
0
のノードに対しても関連ノード間を繋ぐ点線が引かれる場合がある(LookAndFeel
に依存)ので、これを非表示にする場合は、UIManager.put("Tree.paintLines", Boolean.FALSE);
、またはtree.putClientProperty("JTree.lineStyle", "None");
などを使用する