# Treeview Icon hinzufügen



## Nud3l (21. Sep 2009)

Hallo 

ich habe ein Treeview und möchte nach dem mein prog fertig ist dort Icon hinzufügen. Also die schicken Ordner ersetzen.

meine treeview habe ich aus einem Beispiel heraus aufgebaut nur wurden da keine Icons hinzugefügt und ich glaub schon fast das es so ohne weiteres nicht möglich ist.

hier sind meine tree Elemente an denen ich gerne ein Image binden möchte was kann man da machen?


```
class TreeObject implements IAdaptable {
    private String name = null;
    private TreeParent parent = null;

    public void setName(String name) {
      this.name = name;
    }

    public TreeObject(String name) {
      this.name = name;
    }

    public String getName() {
      return name;
    }

    public void setParent(TreeParent parent) {
      this.parent = parent;
    }

    public TreeParent getParent() {
      return parent;
    }

    public String toString() {
      return getName();
    }

    @SuppressWarnings("unchecked")
    public Object getAdapter(Class key) {
      return null;
    }
  }


  class TreeParent extends TreeObject {
    private ArrayList<TreeObject> children;

    public TreeParent(String name) {
      super(name);
      children = new ArrayList<TreeObject>();
    }

    public void addChild(TreeObject child) {
      children.add(child);
      child.setParent(this);
    }

    public void removeChild(TreeObject child) {
      children.remove(child);
      child.setParent(null);
    }

    public TreeObject[] getChildren() {
      return (TreeObject[]) children.toArray(new TreeObject[children.size()]);
    }

    public boolean hasChildren() {
      return children.size() > 0;
    }
  }
```


----------



## Gonzo17 (21. Sep 2009)

Hm.. ich mach das immer mit nem TreeViewer, der hat nen Content- und nen Labelprovider, die man problemlos selbst schreiben kann und im Labelprovider gibts ne Methode, die definiert, welches Image angezeigt werden soll. Ist dort also relativ einfach. 

Wo und wie genau willst du denn den Tree verwenden? Woher hast du das Beispiel?


----------



## Nud3l (21. Sep 2009)

also Content- und nen Labelprovider habe ich auch. 

Aber die elemente in der treeview sind eben von dem beschrieben typ und die adde ich dann an der treeview dran dann IContenttreeview usw. hat...


----------



## Gonzo17 (21. Sep 2009)

Hö, bin ich blind? Wo verwendest du nen Labelprovider?

Dann isses eigentlich ganz einfach. Da gibts die Methode Image getImage(Object element), die eben für JEDES Element in deinem Tree aufgerufen wird. Wenn du verschiedene Elemente hast, also von verschiedenem Typ, dann musst du Unterscheidungen machen, ist klar (sowas wie if element instanceof ...).


----------



## Nud3l (21. Sep 2009)

Oh man das ist nicht ganz so schick ..

denn es sind alle vom selben typ eben TreeParent ... und es sollen 8 verschiedene icons vertwilt werden. Dann muss ich wohl die ganze element zerpflücken wie schon bei den Actionlistener...um an den typ zukommen was für ein Images es bekommt.

Mist ich hätte die ganze View anders aufbauen sollen aber jetzt es zu ändern  lohnt nimmer. Habe ja die abfragen schon nur muss ich eben den inhalt ändern oder das ganze auslagern mal sehen wie ich das mach...


----------



## Wildcard (21. Sep 2009)

Ich glaube du denkst zu Swing-lastig. Swing hat das Problem das du ein designiertes Swing-Modell benutzen musst um dein Domain Modell zu rendern. JFace ist da wesentlich flexibler da es Domain Modelle direkt rendern kann (ohne Zwischenschritte wie TreeObject) sofern du entsprechende Adapter in Form von Content- und LabelProvider zur Verfügung stellst.


----------



## Nud3l (21. Sep 2009)

Ich komme wieso total durch einander mit den beiden.  

Ich schreibe gerade mein DA als Eclipse Plugin und neben bei musst ich noch ne Hausarbeit in Benutzeroberflächen fertig machen, die in Swing sein sollte... 

Das hin und her switch ist nicht ganz so toll... 

Aber das ist jetzt vorbei jetzt gibt es nur noch die DA..


----------



## Gonzo17 (22. Sep 2009)

Ich geb dir mal ein Beispiel, wie so ne View-Klasse aussehen könnte (ich erhebe keinen Anspruch auf Richtigkeit  aber bei mir funktionierts gut):


```
public class NewViewer extends ViewPart {

	private class NewViewerTreeContentProvider implements
			ITreeContentProvider {

		@Override
		public Object[] getChildren(Object element) {
			return getElements(element);
		}

		@Override
		public Object[] getElements(Object element) {
			if (element instanceof whatever)
				return (whatever) element;
                        // und weitere Unterscheidung durch if-Abfragen
			
			return new Object[] {};
		}

		@Override
		public Object getParent(Object element) {
			if (element instanceof whatever)
				return ((whatever) element).getParent();
                        // hier genauso
			return null;
		}

		@Override
		public boolean hasChildren(Object element) {
			return getElements(element).length != 0;
		}
	}

	private class NewViewerTreeLabelProvider extends LabelProvider {

		@Override
		public Image getImage(Object element) {
			if (element instanceof whatever)
				return IMAGE; // entsprechendes Bild zurückgeben

			return null;
		}

		@Override
		public String getText(Object element) {
			if (element instanceof whatever)
				return ((whatever) element).getLabel(); // und wieder das selbe Spiel
			
			return element.toString();
		}
	}

	}

	private TreeViewer viewer;
	
	@Override
	public void createPartControl(Composite parent) {
		
               // ...

		viewer = new TreeViewer(parent, SWT.BORDER);
		viewer.setContentProvider(new NewViewerTreeContentProvider());
		viewer.setLabelProvider(new NewViewerTreeLabelProvider());
		viewer.setInput(meinInput);
	        
                // ...
	}
}
```

Danach kannst du noch Listener hinzufügen, um zum Beispiel einen Doppelklick abzufangen, je nachdem was du noch machen willst damit.


----------



## Nud3l (22. Sep 2009)

Hmm meine sieht eigentlich ganz ähnlich aus...

Meine View ist 


```
public class Projektview extends ViewPart {
```

Darin habe ich dann 4 weitere Klassen... einmal die beiden oben beschriebenen und jetzt noch


```
class ViewContentProvider implements IStructuredContentProvider,
                           ITreeContentProvider, Observer {
```

und jetzt neu 


```
class ViewLabelProvider extends LabelProvider {
```


Der Aufbau erfolgt bei mir in ViewContentProvider wo ich dann Elemente von dem TreeParent adde..

und ich dachte das ich bei den zu addenen Element ein Icon hinzufügen muss. Aber ich habe es jetzt über die von euch beschriebenen Methode getImage gemacht und läuft auch wunder bar.

Nur hätte ich wohl besser am Anfang die Typen mit angeben müssen um immer zu wissen was ich markiert habe. Bei mir öffnet sich bei jeden Doppelklick eine anderer Editor. Und das herausfinden welchen ich öffnen muss ist nicht ganz so trivial.. da stecken ne Menge code hinter der eigentlich überflüssig ist....

naja ist mein erstes Eclipse Projekt da kann nicht immer alles Perfekt sein.


----------

