# JTree Filter erstellen



## dhachim (11. Feb 2009)

Wieder ein Problem beim Jtree

Ich möchte gerne einen Filter für einen JTree bauen. Das ganze muss nicht unbedingt zur Laufzeit sein. 
Ich habe mir gedacht, mach doch einfach eine Kopie von deinem TreeModel und veränder die Kopie nach deinen Filtereinstellungen. Tja soweit zur Theorie. 
Wie kann ich denn jedes einzelne Element in einem TreeModel durchlaufen ? ich würde dann einfach nichtgewünschte Nodes mit removeNodeFromParent(node) entfernen. Bei bedarf nehm ich dann wieder mein Basismodel. 

Oder vielleicht gibts eine Möglichkeit das ganze im TreeRenderer zu machen, Also einfach bestimmte Nodes nicht anzuzeigen. (Wovon ich aber nicht ausgehe)

Ich hoffe ich hab mich diesmal klarer ausgedrückt als sonst   :autsch:


----------



## Michael... (11. Feb 2009)

Ich würde dafür auch zwei TreeModels verwenden.

Zum filtern einfach rekursiv die Knoten durchlaufen. Die Methoden zum Durlaufen liefert ja das Model z.B. DefaultTreeModel


----------



## Ebenius (11. Feb 2009)

Ergänzend: Der TreeRenderer kann das nicht, da er eigentlich TreeCellRenderer heißt und genau das macht: Eine Zelle im Baum zeichnen.

Ich würde ebenfalls zwei Modelle nutzen. Habe auch schon zweimal JXTrees gebaut die per NodeMapper (ein Model das ein anderes Modell on-the-fly filtert) filtern und sortieren können ─ leider beide Implementationen für zwei verschiedene Firmen, so dass ich den Quelltext nicht hergeben darf.   Zwei Dinge dazu: 
Es ist ordentlich Arbeit das hübsch und schnell zu machen
Wenn's nicht funktioniert, nochmal anfangen. Die zweite Implementation ist wesentlich besser und hat mich nur halb so viel Nerven gekostet. 
 Ebenius


----------



## dhachim (11. Feb 2009)

Danke. Michael kannst du mir vielleicht nen Code geben um da Rekursiv durchzulaufen. Ich habe zwar eine Methode aber die steigt nach dem ersten Fund aus. Ich hab weiter echt nen Knoten im Hirn, wie ich sowas rekursiv lösen kann. 
Zudem muss ich ja am Ende ein neues Model bekommen. 

Naja heute ist erst mal schluss, genug geärgert. Wäre toll wenn da noch hinweise kommen würden.

Ebenuis, Nodemapper ... klingt ja fein. mal sehen was sich da finden lässt.


----------



## Ebenius (11. Feb 2009)

So in etwa kann das funktionieren. Aber ungetestet: 
	
	
	
	





```
static interface TreeNodeFilter {

  boolean accept(DefaultMutableTreeNode node);
}

static DefaultMutableTreeNode createFilteredNodeTree(
      DefaultMutableTreeNode node,
      TreeNodeFilter filter) {
  /* create a clone */
  final DefaultMutableTreeNode clonedNode = new DefaultMutableTreeNode();
  clonedNode.setAllowsChildren(node.getAllowsChildren());
  clonedNode.setUserObject(node.getUserObject());

  /* first check all children */
  final int orgChildCount = node.getChildCount();
  for (int childIndex = 0; childIndex < orgChildCount; childIndex++) {
    final DefaultMutableTreeNode orgChild =
          (DefaultMutableTreeNode) node.getChildAt(childIndex);
    final DefaultMutableTreeNode clonedChild =
          createFilteredNodeTree(orgChild, filter);
    if (orgChild != null) {
      clonedNode.add(clonedChild);
    }
  }

  /* accept the root node plus all nodes that either have children or match
   * the filter */
  return node.getParent() == null
        || clonedNode.getChildCount() > 0
        || filter.accept(node) ? clonedNode : null;
}
```

Ebenius


----------

