SWT -> JFace: TreeViewer

Status
Nicht offen für weitere Antworten.

byte

Top Contributor
Hallo,

Ich möchte meine Datenstruktur mit einem TreeViewer darstellen. Das klappt auch soweit ganz gut, trotzdem habe ich noch ein Problem, das ich bisher nicht zufriedenstellend lösen konnte. Zunächst einmal eine vereinfachte Beschreibung der Datenstruktur:

Code:
class A {
  String name;
  List[B] elements;
  ...
}

class B {
  String name;
  ...
}

Knoten eines Objekts von A sollen nun nicht direkt die Objekte von B als Unterknoten besitzen sondern diese sollen nochmal der Übersichtlichkeit halber in einem Knoten "Liste" gekaspelt sein.

Hier Auszüge aus dem Content und LabelProvider:

Code:
//ContentProvider:

public Object[] getChildren(Object o) {
  if(o instanceof A) {
    A a = (A) o;
    return new Object[] { a.getElements() };
  } else if(o instanceof List) {
    List l = (List) o;
    return l.toArray();
  } else {
    return null;
  }
}

Code:
//LabelProvider:

public String getText(Object o) {
  if(o instanceof A) {
    A a = (A) o;
    return a.getName();
  } else if(o instanceof B) {
    B b = (B) o;
    return b.getName();
  } else if(o instanceof List) {
    List l = (List) o;
    return "...";       // <------ Hier möchte ich gerne den generischen Typ der Liste als Name ausgeben
  } else {
    return null;
  }
}


Das Ganze sieht natürlich recht unschön aus, aber ich sehe keine andere Möglichkeit als die instanceof Prüfungen. Oder kann man das auch irgendwie eleganter lösen?

Außerdem müsste ich entsprechend den generischen Typ der Liste auslesen, um den Knoten entsprechend je nach Liste zu benennen.

Würde mich über Vorschläge freuen.

Frohe Ostern weiterhin ... 😉
 
Statt
Code:
List l = (List) o; 
return "...";
kannst du folgendes schreiben
Code:
String className = o.getClass().getName();
return className.substring(className.lastIndexOf(".")+1);
dann kriegstdu z.B. "ArrayList" als Ausgabe.
Oder meinst du was anderes?

Das mit dem instanceof ist schon OK so. Du könntest zwar mit IAdapterFactory und
IWorkbenchAdapter arbeiten, das geht aber mehr in Richtung Plugins bzw. RCP.
 
Ich hab mich vielleicht etwas unklar ausgedrückt. Ich habe z.B. Listen die Funktionsobjekte halten
Code:
List<Function>

Im Tree soll dann Functions als Knoten stehen (nicht List) und dann als Unterknoten die Inhalte der Liste (in diesem Fall also die Function Objekte).

Ich müsste also den Typ der Listenelemente kennen. Mir fällt jedoch keine Lösung dazu ein ausser dass ich mir die Elemente der Liste angucke. Das funktioniert ja auch, aber wenn die Liste leer ist, hab ich ein Problem.
 
Puuh, ich weiss jetzt, was du meinst. Keine Ahnung, wie man an die Deklaration rankommt.
Die Methoden von Class liefern alles, nur nicht die Generics und wenn dann in der abstrahierten
Form wie z.B. add(E). Wofür dieses E steht, konnte ich zur Laufzeit nicht herausfinden.
Aus Neugier habe ich mir paar Sachen angeschaut. Es gibt in java.lang.reflect paar Interfaces
wie ParameterizedType, TypeVariable, WildcardType aber das ganze scheint sich im Kreis
zu drehen.
z.B:
Code:
List<Integer> list = new ArrayList<Integer>();
Class clazz = list.getClass();
for(TypeVariable v : clazz.getTypeParameters())
{
  System.out.println(v); // Ausgabe: E
  System.out.println(v.getClass()); // Ausgabe: sun.reflect.generics.reflectiveObjects.TypeVariableImpl
  System.out.println(((sun.reflect.generics.reflectiveObjects.TypeVariableImpl)v).getGenericDeclaration()); // Ausgabe: java.util.ArrayList ????
}
Spätestens bei der letzten Ausgabe hätte ich was anderes erwartet. ???:L
Es würde mich auch interessieren. Wenn jemand es weiss, wie man an die Deklaration
im Klartext rankommt, dann bitte melden.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben