# Animation durch Button auslösen



## Butterfly (9. Jun 2008)

Hallo,

ich steh hier grade vor einem großen Problem, es geht um folgendes:
Ich will ein Programm schreiben, mit dem man binäre Bäume darstellen kann.
Dazu habe ich ein JPanel als Zeichenfläche, auf dem ich den Baum per paintComponent zeichne und auf einem anderen JPanel verschiedene Buttons, um Knoten hinzuzufügen, zu entfernen etc.
Bisher funktioniert das auch super, mein Baum wird ohne Probleme gezeichnet.
Jetzt wollte ich mich daran machen, dass ganze zu animieren. Drückt der Benutzer z.B. "Search" soll per Animation die Navigierung durch den Baum gezeigt werden.

Jetzt kommt mein Problem:
Wie starte ich Animationen per JButton Knopfdruch bzw. per ActionListener-Event?
Ich dachte mir, ich rufe dazu einfach auf meiner Zeichenflächen-Klasse eine Methode auf, die die Animation ausführt. Also per Schleife die grafischen Elemente neu setzen und dann repaint aufrufen, solange bis die Animation zu Ende sein soll. Das Problem ist, das repaint() nicht dann ausgeführt wird, wenn ich es will.
Repaint() wird erst dann aufgerufen, wenn meine Methode zum Animieren durchgelaufen ist und somit die Animation auch schon längst vorbei ist. Nach der API liegt das wohl daran, dass repaint() erst ausgeführt wird, wenn alle aktuellen Events behandelt wurden. Da die Animationsmethode ja von einem Button-Event aufgerufen wurde, also hier erst, wenn die Methode vorbei ist.

Ich hatte dann probiert, die Animation direkt in der repaint()-Methode zu konstruieren, indem ich z.B. eine ArrayList mit den nötigen Infos für die Animation erstelle und auf diese dann zugegriffen wird. Leider zeichnet repaint() aber erst dann tatsächlich neu, wenn schon alles ausgeführt wurde.

Ich bin so langsam am verzweifeln, vermutlich ist das ein ganz häufiges Problem, aber ich konnte per Suche & Google nichts finden. Es wäre echt super, wenn mir da jemand helfen könnte.


----------



## André Uhres (9. Jun 2008)

Die Animation muss in einem Backgroundthread laufen. Du kannst dazu z.B. einen javax.swing.Timer benutzen. Beispiel: TimerAnimation.jar (Quellcode im jar)


----------



## Butterfly (9. Jun 2008)

Sehe ich das richtig, dass der Timer im angegebenen Zeitintervall immer wieder die actionPerformed-Methode der TimerAnimation-Klasse aufruft?

In meinem Fall würde ich das also folgendermaßen machen:
-> Mit meiner Klasse die actionPerformed Methode von ActionListener implementieren.
-> Wird der Button gedrückt, erstelle ich einen Timer und lasse ihn laufen.
-> In der actionPerformed-Methode setzte ich die Animationsdaten neu und rufe repaint() auf.
-> Damit der Timer auch irgendwann aufhört zu laufen (die Animation soll ja nicht ewig rennen), überprüfe ich in meiner actionPerformed-Methode, ob die Animation beendet ist und rufe dann stop() auf dem Timer auf.

Würde das prinzipiell so funktionieren?

/Edit:
Ich habs jetzt trotz der späten Stunde selbst noch ausprobiert - und siehe da, es funktioniert genauso, wie ich es will. Super! Dankeschön!


----------

