# JTree-Anzeige filtern



## AlArenal (14. Feb 2005)

Ich brauche eine Möglichkeit in einem JTree bestimmte Objekte nicht anzuzeigen, die aber dennoch im TreeModel vorhanden bleiben müssen. Hat vielleicht jemand eine Idee?


----------



## Beni (14. Feb 2005)

Ich würde einen "Wrapper" um dein eigentliches TreeModel machen. Also ein Filter-TreeModel das Daten aus dem "echten" Model holt, aber nicht alle Knoten an den JTree weiterleitet.


----------



## AlArenal (14. Feb 2005)

Ja, sowas hatte ich mir auch ursprünglich überlegt, aber bin dabei auf Probleme gestoßen.

Beispiel:
- ein Objekt hat 7 Children
- durch den Filter werden 2 Children ausgeblendet
- die angepasste getChildCount() lliefert demnach 5
- zulässiger Index wäre demnach 0..4
- es gibt aber keine Garantie das alle 5 anzuzeigenden Children auch auf den Positionen 0..4 liegen

Vielleicht bin ich auch noch etwas grippe-doof....


----------



## foobar (14. Feb 2005)

> Ich brauche eine Möglichkeit in einem JTree bestimmte Objekte nicht anzuzeigen, die aber dennoch im TreeModel vorhanden bleiben müssen. Hat vielleicht jemand eine Idee?


Ich hab das mal für einen JTable geschrieben. 
Du mußt einfach, so wie Beni schon geschrieben hat, einen Decorator um das Model setzen, in dem du die Indize übersetzt. Das lässt sich leicht über eine HashMap lösen, in der man die angezeigten Indize und die realen Indice speichert.


----------



## Beni (14. Feb 2005)

Entweder sowas wie foobar sagt, oder du zählst dann die Indices neu ab (direkt beim Aufruf). Ob das die Geschwindigkeit merklich verlangsamt, wage ich jetzt mal zu bezweifeln :wink:

Als Beispiel:

```
public Object getChild( Object parent, int index ){
  int count = model.getChildCount( parent );  // model ist das "originale" Model
  for( int i = 0; i < count; i++ ){
    Object child = model.getChild( parent, i );
     if( isVisible( child ){   // isVisible: true, wenn es nicht rausgefiltert wird
        if( index == 0 )
           return child;
        else
           index--;
     }
  }

  throw new IllegalStateException( "Etwas ist schiefgegangen" );
}
```


----------



## AlArenal (14. Feb 2005)

@beni:
Das mit dem neue abzählen schnall ich gerade nicht.

Sagen wir mal ein Objekt hat folgende Children:

1x
2y
3x
4y
5x
6y

Nun brauche ich einen Filter, der mir alle x nicht anzeigt. Ich hätte dann nicht mehr 6, sondern 3 Children und diese lägen nicht auf den Indices 0, 1, 2, sondern in diesem Fall auf 1, 3, 5.

Im FilterModel müsste ich nun Zugriffe auf die Children über deren Index ummapen, von 0 => 1, 1 => 3 und 2 => 5, d.h. im Grunde beim Zugriff die Children im Originalmodel durchlaufen und mitzählen...

Soweit richtig verstanden?


----------



## Beni (14. Feb 2005)

Ja, das wollte ich dir sagen. Die Methode die ich gepostet habe sollte (ich habs nicht getestet) auch genau das machen.


----------



## AlArenal (14. Feb 2005)

Das funzt indeed! 

Danke!


----------

