# SWT und Tree, wie kann ich TreeItem aus einem Tree entfernen?



## Koringar (20. Mrz 2009)

Guten Tag,

ich habe neuer dings mit SWT zutun und habe auch schon viel mitgemacht, nun bin ich bei den Tree's von SWT angelangt (da TableTree deprecated (veraltet) ist, verwende ich Tree).
Und das hinzufügen von Elementen funktioniert auch, nun habe ich aber ein Problem bei entfernen vin bestimmten TreeItems innerhalb der Tree. Das Item finde ich heraus, blos gibt es keine Mehtode dieses zuentfernen (gibt nur removeAll()).
Und nun wollt ich Fragen ob jemand da vielleicht eine Lösung hat oder damit schon Erfahrung hat.

Ich habe schon versucht mit die Elemete mit getItems() geben zulassen und dann wieder neu auf das Tree zumachen, funkt aber nicht da der Tree mit removeAll() dispose wird. Ein neu erstellen des kompletten Tree's hat auch nicht gebracht.


----------



## Wildcard (20. Mrz 2009)

Da du neu in SWT bist vermute ich, der Tree war keine explizite Wahl.
Wenn man kein Masochist ist, verwendet man SWT Controls nicht direkt, sondern MVC/MVA Varianten von JFace. Schau dir den TreeViewer an.


----------



## Koringar (23. Mrz 2009)

Also gehört habe ich davon schon, blos ich kann darauf irgend wie nicht Zugreifen. Ab welchen Java Version ist dieser Implementiert?


----------



## Wildcard (23. Mrz 2009)

Ist ein jar.
JFace - Eclipsepedia


----------



## Koringar (24. Mrz 2009)

THX,
brauchte es nicht runterladen, musste es nur explixit mit dem SWT Toolkit einbinden.

Wie funktioniert das REMOVE von dem TreeViewer genau?

Ich habe das so versucht 'trv_channel.remove(trv_channel.getTree().getItem(b));' (b ist der Zähler in einer Schleife und die Stelle an der das Item steht in dem Tree), aber es funktioniert nicht.
Habe in den Docs gesehend das man da 'elementsOrTreePaths' angeben muss, wie bekomme ich das raus. Bei dem Versuch will ich das oberste Item des Tree löschen.


----------



## Koringar (24. Mrz 2009)

Ah habs gerade selbst raus gefunden,
nach dem Remove muss noch ein Refresh kommen, sonst macht er einfach so weiter .

Danke aber für deine Mühe Wildcard.


----------



## Koringar (24. Mrz 2009)

Und schon wieder gleich die nächste Frage .

Beim hinzufügen von neuen Items unter ein anderes Item kommt ja dann immer ein
Plus von den Einträgen, jedoch wenn ich dann darauf klicken will verschwindet aber dieses Plus wieder. Jemand vielleicht eine Ahnung voran das liegen kann? (ein Refresh bringt auch nichts)

Edit:
So wie es aussieht löscht er den Eintrag wieder sobald ich drauf klicke.


----------



## Wildcard (24. Mrz 2009)

remove? Das machst du eigentlich nicht selbst da der ContentProvider für den Inhalt zuständig ist. Du musst dem Tree nur sagen, was er refreshen soll.
Das Plus kommt ebenfalls aus dem ContentProvider. Ob du ein plus siehst, oder nicht, hängt davon ab was die hasChildren Methode liefert.


----------



## Koringar (25. Mrz 2009)

Jo habe ich zu Teil jetzt auch mitbekommen und wie kann ich jetzt neue Inhalte rein setzen ohne das sie verschwinden? Habe da schon einige Beispiele gesehen die das mit setInput machen, habe die aber nicht so richtig verstanden.


----------



## Koringar (25. Mrz 2009)

Gut habe es jetzt raus gefunden wie es geht. Man braucht einen Klasse, die sich selbst als Arraylist speichern kann und mit der macht man alle Operationen die man will.
Dann macht man am Ende diese setInput und die Tree wird neu gezeichnet.


----------



## Wildcard (25. Mrz 2009)

> Gut habe es jetzt raus gefunden wie es geht. Man braucht einen Klasse, die sich selbst als Arraylist speichern kann und mit der macht man alle Operationen die man will.


Ganz ehrlich, ich habe nicht die geringste Ahnung was du damit wohl meinen könntest.


> Dann macht man am Ende diese setInput und die Tree wird neu gezeichnet.


Am besten ist immer nur selektiv updzudaten (nur  was sich wirklich geändert hat). Dafür gibt es Methoden wie diese:
StructuredViewer (Eclipse Platform API Specification)


----------



## Koringar (26. Mrz 2009)

Wildcard hat gesagt.:


> Ganz ehrlich, ich habe nicht die geringste Ahnung was du damit wohl meinen könntest.



Eine Klasse (sagen wir mal MyModel als Name) hat die Variabel 'MyModel parent;' in der das Elternelement gespeichert wird, dann 'Arraylist<MyModel> child;' in der ihre ganzen Kindelemente gespeichert werden.
In dieser inplementiert man alle Methode die man so braucht zb. 'removeChild', 'addChild' usw., wichtig ist jedoch das man die toString Methode implementiert da sie das Anzeigen im Tree steuert. Also alles was toString wieder gibt wird im TreeViewer als Text angezeigt.
Kleines Beispielt, was mir geholfen hat:
[Eclipse_Project] View of /org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet002TreeViewer.java



Wildcard hat gesagt.:


> Am besten ist immer nur selektiv updzudaten (nur  was sich wirklich geändert hat). Dafür gibt es Methoden wie diese:
> StructuredViewer (Eclipse Platform API Specification)



Thx, mit refresh zeichnet er nicht komplett neu. Das heist das die ausgeklappten Elementen im TreeViewer jetzt auch ausgeklappt bleiben .


----------



## Wildcard (26. Mrz 2009)

Koringar hat gesagt.:


> Eine Klasse (sagen wir mal MyModel als Name) hat die Variabel 'MyModel parent;' in der das Elternelement gespeichert wird, dann 'Arraylist<MyModel> child;' in der ihre ganzen Kindelemente gespeichert werden.
> In dieser inplementiert man alle Methode die man so braucht zb. 'removeChild', 'addChild' usw., wichtig ist jedoch das man die toString Methode implementiert da sie das Anzeigen im Tree steuert. Also alles was toString wieder gibt wird im TreeViewer als Text angezeigt


Not quite. JFace ist nicht  wirklich Model-View-Controler, sondern mehr Model-View-Adapter. Wie dein Model aussieht ist völlig irrelevant, solange der Content Provider das Model für die View übersetzen kann. Dein Model selbst muss also keine Baumstruktur sein, nur weil es in einem Tree anzeigen möchtest. toString hat hier auch nicht wirklich eine Bedeutung, dafür gibt es ja den LabelProvider. Er sagt der View, wie es ein Element deines Domain Models anzeigen muss.


----------

