Java - Rekursion
brand
- programmiertechnik
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
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
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...
- 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
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