# SWT/JFace TreeViewer: Rootknoten anzeigen



## SamHotte (26. Sep 2006)

Anscheinend bin ich zu bräsig, es selbst zu finden, aber weder hier noch bei Google bin ich fündig geworden:

Wie schalte ich beim TreeViewer den  Wurzelknoten ein (beim Swing.JTree gibt's sowas wie "setRootVisible()")?

Besten Dank!


----------



## Clip (27. Sep 2006)

meines wissens nach wird der rootknoten bei swt nie angezeigt, und kann auch nicht angezeigt werden.
wie gesagt, meines wissens nach...


----------



## byte (27. Sep 2006)

Das kann man doch beliebig über Content- und LabelProvider steuern, was im Baum angezeigt werden soll und was nicht. ???:L


----------



## SamHotte (27. Sep 2006)

Und wie baut man die Provider so, dass es es anzeigt? Ich probier' mir da schon 'nen Wolf ... 

Bei mir kommen leider immer nur die Blätter der ersten Ebene (und alles darunter liegende), was bei leerem Baum ein Problem ist, da mein Programm nur Knoten einfügen lässt, wenn ein Vaterknoten ausgewählt ist (und das soll auch so bleiben).


----------



## byte (27. Sep 2006)

Zeig doch mal Deine Content- und LabelProvider. So pauschal kann ich da wenig zu sagen.

Evtl. hilft Dir das hier auf die Sprünge:



> The difference between this method and IStructuredContentProvider.getElements is that getElements is called to obtain the tree viewer's root elements, whereas getChildren is used to obtain the children of a given parent element in the tree (including a root).


----------



## SamHotte (27. Sep 2006)

ContentProvider:

```
public class MerkmalsbaumContentProvider implements ITreeContentProvider {

    private static final Logger LOGGER = Logger
            .getLogger(MerkmalsbaumContentProvider.class);

    public Object[] getChildren(Object parentElement) {
        Helper.pruefeParameter(parentElement);
        Object[] result = new Object[0];
        if (parentElement instanceof IMerkmalsbaumKnoten) {
            IMerkmalsbaumKnoten parent = (IMerkmalsbaumKnoten) parentElement;
            result = parent.getKindknoten();
        } else {
            LOGGER.error(Meldung.FALSCHER_PARAMETERTYP
                    + parentElement.getClass().toString());
        }
        return result;
    }

    public Object getParent(Object element) {
        Helper.pruefeParameter(element);
        Object result = null;
        if (element instanceof IMerkmalsbaumKnoten) {
            IMerkmalsbaumKnoten node = (IMerkmalsbaumKnoten) element;
            result = node.getElternknoten();
        } else {
            LOGGER.error(Meldung.FALSCHER_PARAMETERTYP
                    + element.getClass().toString());
        }
        return result;
    }

    public boolean hasChildren(Object element) {
        return getChildren(element).length > 0;
    }

    public void dispose() {
        // scheint nicht benötigt zu sein.
    }

    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        // scheint nicht benötigt zu sein.
    }

    public Object[] getElements(Object inputElement) {
        return getChildren(inputElement);
    }

}
```

(Helper.pruefeParameter(..) wirft eine IllegalArgumentException, wenn das Argument null ist.)

LabelProvider:

```
public class MerkmalsbaumLabelProvider
        implements ILabelProvider
{

    public Image getImage (Object element) {
        Image result = null;
        if (element instanceof IMerkmalsbaumKnoten) {
            IMerkmalsbaumKnoten node = (IMerkmalsbaumKnoten) element;
            if (node.isBlatt()) {
                result = Helper.getImageRegistry().get(Helper.ICON_DATEI);
            } else {
                result = Helper.getImageRegistry().get(Helper.ICON_ORDNER);
            }
        }
        return result;
    }

    public String getText (Object element) {
        return element.toString();
    }

    public void addListener (ILabelProviderListener listener) {
        // wird anscheinend nicht gebraucht
    }

    public void dispose () {
        // wird anscheinend nicht gebraucht
    }

    public boolean isLabelProperty (Object element, String property) {
        // wird anscheinend nicht gebraucht
        return false;
    }

    public void removeListener (ILabelProviderListener listener) {
        // wird anscheinend nicht gebraucht
    }

}
```

Hab' ich analog zu Beispielen aus dem Web bwt. "JFace in Action" gebaut. Funzt eigentlich soweit, bis auf den Rootknoten ...


----------



## byte (27. Sep 2006)

Wenn mich nicht alles täuscht, dann überspringst Du hier das Root Element, indem Du direkt die Kinder besorgst. Die getElements() ist die Methode, die zuerst am Anfang aufgerufen wird wenn mit setInput() der Inhalt gesetzt wird und bestimmt quasi das/die Root-Elemente des Baums.


```
public Object[] getElements(Object inputElement) {
        return getChildren(inputElement);
    }
```


----------



## SamHotte (28. Sep 2006)

Das kann sein. Allerdings weiß ich nicht wirklich, was ich stattdessen dort hineinschreiben soll ... wenn ich das bisherige durch

```
public Object[] getElements(Object inputElement) {
//        return getChildren(inputElement);
        Object[] result = new Object[1];
        result[0] = inputElement;
        return result;
    }
```
ersetze, zeigt er mir die Wurzel an - und die hat dann als Kind nur noch sich selbst  :autsch: 

Sieht ungefähr so aus dann:

```
Wurzel
+--Wurzel
   +--Wurzel
      +--Wurzel
usw.
```


----------



## byte (28. Sep 2006)

Hm komisch. Versuch mal in der getElements() null zurückzuliefern, wenn der Objektparameter kein Root ist.


```
public Object[] getElements(Object inputElement) {
        if(!isRoot()) return null;
        Object[] result = new Object[1];
        result[0] = inputElement;
        return result;
    }
```


----------



## SamHotte (28. Sep 2006)

Nö, bringt leider nix, wieder nur Wurzeln.


----------



## SamHotte (29. Sep 2006)

Hat eventuell jemand ein funktionierendes Beispiel? Per Google finde ich nur die "MovingBox", und das Beispiel zeigt leider nur die einfachen Sachen (wie so oft...). Wäre klasse.


----------

