• title: JTreeのノードを名前で検索して表示のフィルタリングを行う tags: [JTree, TreePath, TreeCellRenderer, DefaultMutableTreeNode] author: aterai pubdate: 2016-08-01T03:05:47+09:00 description: JTreeのノードを検索し、そのTreePathが条件に一致しないノードを非表示にするフィルタリングを行います。

概要

JTreeのノードを検索し、そのTreePathが条件に一致しないノードを非表示にするフィルタリングを行います。

サンプルコード

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

解説

上記のサンプルでは、指定された条件に一致しないノードを高さ0TreeCellRendererで描画することで、ノードのフィルタリングを行っています。

  • TreePathに指定された接頭辞で始まるTreeNodeが含まれている場合、そのノードのUserObjectに表示フラグを立てる
    • 例: fooで検索した場合、foodノード以下の子ノードも表示される
  • TreeCellRendererで、UserObjectを取得し、非表示の場合は高さ0JLabelをレンダラーとして返す
    • tree.setRowHeight(-1);と設定しているので、各ノードの推奨サイズが行の高さとして使用される

参考リンク

コメント