SWT TreeViewer: Daten aus Model gelöscht... trotzdem noch im Baum

Düark

Aktives Mitglied
Hi, habe ein mysteriöses Problem:
habe einen JFace TreeViewer mit ContentProvider.
Wenn ich Daten aus meinem Model lösche, den Viewer refreshe, habe ich trotzdem noch "Geister-Items" in meinem Baum: Wenn ich mit der Maus über den Baum fahre, sehe ich noch unsichtbare Items, d.h. nur die Selektion, ohne Text und so.
Mein Model wird nach dem Refresh vom ContentProvider richtig abgefragt und liefert auch die korrekten Daten. Scheint nur so als wenn der Baum das nicht alles mitbekommt.
Wenn ich danach mit viewer.getTree().getItems() die Items hole, sehe ich auch (teilweise) noch alte Items. Hat jemand eine Idee?
 
Dann muss irgendwas mit dem Löschen nicht ganz richtig sein.
Zeig mal ein bisschen code, wie du den treeviewer leerst.

Java:
treeViewer.remove(treeViewer.getInput());
 
Zuletzt bearbeitet:
Den TreeViewer selber leere ich ja nicht, sondern ich schmeisse die zu löschenden Elemente aus meinem Model raus. Mein Model hat eine Methode, die eine ArrayList mit Elementen zurückgibt. In dieser Liste sind nach dem Löschen auch nur noch die beabsichtigten Elemente. Dann rufe ich treeViewer.refresh() auf, und kann beobachten, wie der ContentProvider genau diese Liste anfordert (in getElements / getChildren...). Da wird sie dann verarbeitet, und am Ende gibt der ContentProvider ein korrektes Array zurück. Nur stimmt das dann nicht mit dem überein, was dargestellt wird.
Ein treeViewer.refresh() müsste aber doch in diesem Falle reichen, oder?
 
Ich habe jetzt einen Workaround gefunden der zwar gruselig anmuted, aber funktioniert. Dazu habe ich die refresh-Methode des TreeViewers überschrieben.
Java:
public void refresh(){
  setSelection((ISelection)null);
  getTree().clearAll(true);
  super.refresh();
			
  // dispose obsolete
  TreeItem[] items = getTree().getItems();
  for(TreeItem item : items){
     if(!item.isDisposed() && item.getText().equals("")){
         item.dispose();
       }
     }
   }
  };
}
Das ganze funktioniert so, daß erstmal die Selection gelöscht wird, weil die auch noch auf alte Sachen verweisen könnte.
Dann wird clearAll() aufgerufen, was bewirkt dass alle Labels (Text / Icons) des Trees gelöscht werden. Dann wird die eigentliche refresh-Methode des Viewers aufgerufen, die wie in meinem Problem beschrieben, zwar noch obsolete Items übrig lässt, aber nur die gültigen Items wieder mit Labels versieht. Am Ende gehe ich deswegen nochmal über alle Items des Trees und dispose die, die keinen Text mehr haben.
 

Zurück
Oben