2016-04-09 18 views
1

Ich versuche, eine grafische Darstellung meiner Huffman-Code-Struktur zu machen. Ich habe den Stammknoten des Baumes und ich schrieb eine printTree() -Funktion, um sich selbst rekursiv aufzurufen und alle Teilbäume in der Konsole zu drucken. Ich habe ein Applet gemacht, das die Wurzel des Baumes zeichnet und es sind Kinder, aber ich kann nicht herausfinden, wie man den Rest zeichnet, weil ich Farbe nicht rekursiv mit Parametern aufrufen kann. Weiß jemand, wie man rekursiv malt, während man die alte Zeichnung dort behält, damit ich den Rest des Baumes zeichnen kann?Call Farbe rekursiv anfügen Zeichnungen auf einem Java-Applet

System.out.println("Paint"); 
     g.setColor(Color.black); 
     g.drawRect(0, 0, getSize().width -1,getSize().height -1); 
     g.setColor(Color.red); 
     g.drawString(text, 15, 25); 
     g.setColor(Color.white); 
     //left line 
     g.drawLine(ovalCenterx,ovalCentery,leftOvalx+30,leftOvaly); 
     //right line 
     g.drawLine(ovalCenterx,ovalCentery,rightOvalx+19,rightOvaly); 
     g.setColor(Color.green); 
     //draw left circle 
     g.fillOval(leftOvalx,leftOvaly, ovalSize, ovalSize); 
     //draw right circle 
     g.fillOval(rightOvalx,rightOvaly, ovalSize, ovalSize); 
     //draw the root 
     g.fillOval(ovalX, ovalY, ovalSize, ovalSize); 
     g.setColor(Color.white); 
     g.setColor(Color.black); 
     //draw root label 
     g.drawChars(label,0,label.length,ovalX+ovalP,ovalY+ovalP);   
     if(labelleft != null) 
     g.drawChars(labelleft,0,labelleft.length,leftOvalx+ovalP,leftOvaly+ovalP); 
     if(labelright != null) 
     g.drawChars(labelright,0,labelright.length,rightOvalx+ovalP,rightOvaly+ovalP); 
     if(left){ 
      setRootCoord(leftOvalx,leftOvaly); 
     } 
     if(right){ 
      setRootCoord(rightOvalx,leftOvaly); 

das ist meine Farbfunktion. Ich möchte diese Funktion nur bei allen Kindern nennen, bis ich das Ende erreicht habe.

Hier ist die Konsolenversion.

public void printTree(int counter){ 
     counter++; 
//  System.out.println(this.right + " is this.right"); 
//  System.out.println(this.left.data.prob); 
//  System.out.println(this.right.data.prob); 
     if(this.left.data.prob == -1 && this.right.data.prob == -1){ 
      if(counter > 1) 
      return; 
      this.left.printTree(counter); 
      this.right.printTree(counter); 
     } 
     if(this.left.data.prob == -1.0 && this.right.data.prob != -1.0){ 
      System.out.println(this + "my left is -1"); 
      this.left.printTree(counter); 
     } 
     if(this.right.data.prob == -1.0 && this.left.data.prob != -1.0){ 
      System.out.println(this + "my right is -1"); 
      this.right.printTree(counter); 
     } 
     if(this.right.data.prob != -1.0 && this.left.data.prob != -1.0){ 
      System.out.println(this); 
     } 
    } 
+1

* "während die alte Zeichnung dort bleibt .." * Zeichnen Sie alles zu einem 'BufferedImage' und rufen Sie dann' repaint() 'auf dem Etikett mit dem Bild auf. –

+2

1) Um eine bessere Hilfe zu erhalten, geben Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) ein. 2) Warum ein Applet codieren? Wenn es aufgrund der Angabe des Lehrers geschieht, verweisen Sie bitte auf [Warum CS-Lehrer ** aufhören sollten ** Java-Applets zu unterrichten] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-teaching-Java-Applets /). 3) Siehe [Java Plugin-Unterstützung nicht mehr unterstützt] (http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/) und [Wechsel zu einem Plugin-freien Web] (https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free). –

+0

Danke! , Werde ich in BufferedImage schauen. Ich bin nicht gezwungen, ein Applet zu verwenden, ich kann auch etwas anderes verwenden. Ich wollte nur, dass es irgendwann auf einer Website nutzbar ist. –

Antwort

1

Wenn Ihre Farbe ist malen Sie Ihre eigenen paint2(Tree t, Graphics g).

Dann in paint2 Sie tun wie in printTree:

if left paint2(left, g); 

Sie haben die Längen usw. zu messen, obwohl, weil Sie jetzt auf 2D-Raum zeichnen.

+0

Wow! Ich wusste nicht, dass du Grafiken in deinen eigenen Funktionen verwenden kannst, indem du sie von Farbe überträgst. Danke, ich werde das jetzt versuchen. –

+0

Die Rekursion funktioniert, aber die Zeichnung zeigt nur die letzte Zeichnung der Rekursion an. Benötigt dies auch ein gepuffertesImage? –

+0

nicht wissen - post Ihren Code dort - könnte sein, dass Sie verschiedene g's oder etwas anderes verwenden – gpasch