brand: Java - Rekursion

Hallo!

Ich möchte einen Algorithmus in Java nachbilden, der eine Rekursion beinhaltet. Jeder Aufruf der rekursiven Funktion/Methode soll eine grafische Ausgabe machen.

Mein Problem dabei ist nun, dass mir das Wissen über die prinzipielle Vorgehensweise bei der Umsetzung fehlt!
Das Problem ist nicht eine rekursive Methode zu schreiben, sondern die Grafische Ausgaben.

Mein erster Ansatz war

  1. im Konstruktor wird die rekursive Methode aufgerufen
    2)  in der rekursiven Methode werden die für die grafische Ausgabe errechneten Werte in classen-Variablen geschrieben
  2. mittels repaint() wird die paint()-Methode aufgerufen (update() habe ich überschrieben, um ein löschen der alten Ausgaben zu verhindern)
  3. rekursiver Aufruf
    Bei dieser Lösung wird die paint-Methode aber offensichtlich nur einmal aufgerufen, und zwar am Schluss

Also nach folgendem Code (der einfachheit wegen, habe ich keine Rekursion hier, sondern einfach eine for-Schleife verwendet):

...
      int px;

public GrafikTest() { // Konstruktor
  addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
    dispose();
    System.exit(0);
   }
  });

durchlauf();
 }

public void durchlauf() {

int i;
  for(i=0;i<5;i++) {
   px = i*100;
                  System.out.println("durchlauf "+i);
   repaint();
  }
 }

public void update(Graphics g) {  // überscheiben der methode update
  paint(g);
 }

public void paint (Graphics g) {
            System.out.println("paint "+px);
  g.fillRect( px, 10, 50, 50 );

}

-> dies müsste nach meinem (offensichtlich falschem) Verständnis nach folgendes ausgeben:
durchlauf 0
paint 0
durchlauf 1
paint 100
durchlauf 2
paint 200
durchlauf 3
paint 300
durchlauf 4
paint 400

-> tatsächlich wird aber folgendes ausgegeben:
durchlauf 0
durchlauf 1
durchlauf 2
durchlauf 3
durchlauf 4
paint 400
(die methode paint wird also nur einmal ausgeführt -> warum?)

Ich kann ja die Rekursion nicht in der paint-Methode durchführen, da diese ja auch automatisch aufgerufen wird.
Wie geht man soetwas also an?

mfG
brand

  1. Hallo brand,

    Ich möchte einen Algorithmus in Java nachbilden, der eine Rekursion beinhaltet. Jeder Aufruf der rekursiven Funktion/Methode soll eine grafische Ausgabe machen.

    Erst einmal: ich sehe nirgendwo Rekursion...

    1. mittels repaint() wird die paint()-Methode aufgerufen

    Und da liegt auch schon der Fehler. repaint() fügt den Paint-Event der Event-Queue hinzu, die dann später, beim Verlassen der init-Funktion weiter abgearbeitet wird. Wie Events in Java funktionieren, kannst Du unter http://mindprod.com/event11.html genau nachlesen, wie repaint genau arbeitet, unter http://mindprod.com/jglossrepaint.html. Du solltest also lieber getGraphics verwenden, um sofort etwas zu zeichnen.

    Grüße,

    Christian

    --
    Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                          -- Albert Einstein
    1. Hi!

      Erst einmal: ich sehe nirgendwo Rekursion...

      Ich hab ja auch geschrieben, dass das beigefügte Listing eine stark vereinfachte Version (ohne Rekursion) ist.

      Und da liegt auch schon der Fehler. repaint() fügt den Paint-Event der Event-Queue hinzu, die dann später, beim Verlassen der init-Funktion weiter abgearbeitet wird.

      hm, wusste ich nicht.

      Mein Problem war ja das, dass ich nicht wusste, wie ich das prinzipiell realisieren kann.

      Ich hab aber inzwischen eine Lösung gefunden.
      Ich rufe die rekursive Funktion von paint() aus auf und übergebe ihr den Grafikkontext (somit kann ich das Zeichnen in der rekursiven Funktion direkt erledigen)

      mfG
      brand