Baum graphisch darstellen

ingobar

Mitglied
Hallo zusammen,

ich möchte als Übung des Kompositums-Musters einen Baum mit Grafik programmieren. Dazu habe ich folgende Datenstruktur angelegt:

Java:
abstract class Baumelement {
  public abstract Baumelement linksGeben();
  public abstract Baumelement rechtsGeben();
  public abstract void inhaltGeben();
}

class Knoten extends Baumelement {
  private Baumelement links, rechts;
  private String inhalt; //Wird später auf ein allgemeines Datenelement erweitert.

  public Baumelement linksGeben() {return links;}
  public Baumelement rechtsGeben() {return rechts;}
  public void inhaltGeben() {System.out.print(inhalt);}
}

class Abschluss extends Baumelement {
  public Baumelement linksGeben() {return null;}
  public Baumelement rechtsGeben() {return null;}
  public void inhaltGeben() {System.out.print("");}
}

Das Ganze ist erstmal nur ein Entwurf. Ich bitte daher eventuelle Tippfehler, nicht aber Logikfehler zu übersehen.

Jetzt würde ich den Baum aber nicht so gern nur mit System.out rausschreiben, sondern hätte gerne eine grafische Darstellung. So dass die Funktione inhaltGeben() irgendwie so aussieht:

Java:
public void inhaltGeben(Graphics2D g, int vaterX, int vaterY) {
  //Rechteck mit Inhalt
  //Es fehlt noch die Berechnung der aktuellen Position
  Rectancle r = new Rectangle(0, 0, 10, 10);
  g.draw(new Rectangle(0, 0, 10, 10));
  g.drawString(inhalt, r.x + 3, r.y + 2);
  
  //Linie vom Vater nach hier.
  g.drawLine(vaterX, vaterY, r.x + r.width/2, r.y);
}

Meine Fragen: Kennt jemand einen Sourcecode, der das so umsetzt? Ist meine Idee richtig? Gibt es eine einfacher Möglichkeit einen Rechteck mit Text oder Kreis mit Text zu programmieren? Gibt es vielleicht irgendwo eine Bibliothek mit deren Hilfe so etwas einfacher zeichnen kann?

Vielen Dank für eventuelle Tipps,

Ingo
 
Ich würde es ähnlich machen, würde nurnicht
Code:
g.draw(new Rectangle(...));
sondern
Code:
g.drawRect();
.

Ansonsten brauchst du noch ein
Code:
Frame
bzw.
Code:
JFrame
um auf einem
Code:
JPane
l zu zeichnen.
 
Hallo,

so ich habe jetzt ewig versucht das hinzukriegen. Bin aber leider gescheitert.

Das Problem ist irgendwie folgendes: Ich habe die dargestellten Klassenstruktur jetzt noch um eine Klasse TreeCanvas (Singelton) erweitert. Das kann man ansprechen, um ein Rechteck als Knoten zu zeichnen. Aber wo stecke ich die Koordinateninformationen hin? Ich möchte ungern die Koordinaten in die Knoten stecken, da die Position der bereits gezeichneten ja von den weiter untenstehen Knoten abhängt. Immer wenn ein Knoten auf einer neuen Ebene/Level/Tiefe dazukommt, muss den darüberliegenden ja gesagt werden, dass sie auseinander rücken müssen. Oder ich muss vorher die Tiefe das Baumes bestimmen, was ich aber nicht möchte. Das würde irgendwie dem Kompositum-Muster doch widersprechen, oder? Ich möchte ja ausgehend vom Wurzel-Knoten den Aufruf des Zeichnes einfach an die Kindsknoten weitergeben. Mmmmmmmhhhhhh, wenn ich so darüber nachdenke.....und wenn ich in den Aufruf einen die aktuellen Tiefe noch weitergebe? Dann weiß ich ja immer noch nicht, wie viele Kindsknoten ein Knoten hat. Und eine Wurzel mit 5 Blättern muss ich ja breiter machen, als eine Wurzel mit 2 Blättern. Darüber weiß aber das einzelne Blatt nichts. Muss vielleicht die Wurzel die Breite der Blätter bestimmen.

Herrje, ich kriegs einfach gedanklich nicht auseinander. Wie kriege ich dieses Kompsitum-Muster und MVC so ineinander, dass das Kompositum wirklich nur die Datenstruktur ohne Zeichnungsinformationen erfasst und ich eine eigene Klasse zum Zeichnen habe. Wo kommt mein Control hin....zu der Zeichenklasse oder eine Klasse.

Das kann doch nicht so schwer sein, aber ich kriegs einfach nicht aufgeteilt.

Jemand einen Tipp?

Vielen Dank,

Ingo
 

Neue Themen


Zurück
Oben