GUI Aktualisierung deaktivieren

schneubel

Grünschnabel
Hallo zusammen,

mein Problem ist Folgendes: in einer GUI sind verschiedene Balkendiagramme dargestellt deren Balkenhöhe über ein Zufallsarray festgelegt wird.

Aufgabe ist nun, dass die Balken sortiert werden und man in der GUI sehen kann, wie die Balken verschoben werden. Dabei ist jedes Balkendiagramm ein separates "Sortier Objekt", dass mit einem eigenen Sortieralgorithmus in einem eigenen Thread sortiert wird.

Das läuft soweit schon wunderbar, nur jetzt soll über eine Menüleiste möglich sein, die Grafiken an und abzustellen, d.h. wenn ich "anhalten" drücke, bleiben alle Grafiken stehen - die Sortierung läuft im Hintergrund aber weiter. Bei "weiter" setzen die Grafiken beim aktuellen Stand wieder ein und laufen weiter.

Mein bisheriges Vorgehen: in der Steuerklasse setze ich per Menüleiste einen Boolean Wert, ob die Grafik mitlaufen soll, oder nicht. In den Sortierthreads rufe ich dann die Repaint-Methode der Balkendiagramme nur auf, wenn der Wert gesetzt ist.

Mein Problem: die Grafik aktualisiert sich aber trotzdem ständig neu, selbst wenn ich alle repaint Anweisungen auskommentiere.

Daher die Frage: wie würdet Ihr es machen? Wie könnte ich es hinkriegen, dass sich die GUI nicht aktualisiert?

Vielen Dank für Vorschläge + Grüße, schneubel
 
Hi!

Du zeichnest die Balkendiagramme selbst, du nutzt dafür also keine weiteren GUI-Komponenten, sondern "malst" selbst?
Trenne sorgfältig zwischen Steuerklasse und GUI:
Am Besten, die Steuerklasse übernimmt das Zeichnen selbst, sie zeichnet z.B. in ein BufferedImage. Die GUI bekommt das Bild das sie anzeigen soll. Jetzt kann repaint() von wem auch immer aufgerufen werden, sie zeichnet immer nur das Bild neu, das ihr gegeben wurde.

Soll regelmäßig aktualisiert werden, wird ein neues Bild übergeben und repain() aufgerufen :)

So würde ich das jedenfalls machen, vorrausgesetzt, du zeichnest wirklich selbst!

Gruß,

RoCMe
 
Hi RoCMe,

vielen Dank! Das war die Lösung!

Allerdings hat es mich noch ein ganzes Weilchen gebraucht, bis ich die Initialisierungsreihenfolge raus hatte. Ich hatte versucht, die Methode, die das erste BufferedImage erstellt gleich im Konstruktor der Sortiergrafik zu erzeugen und dabei immer eine NullPointerException gefangen.

Jetzt mach ich es so, dass ich die Grafik leer erstelle (also ohne Balken) und dann in der Steuerklasse noch einmal eine selbst geschriebene redraw() Methode aufrufe, die dann das erste BufferedImage erstellt und die repaint Methode aufruft (die ja dann das BufferedImage auf die Sortiergrafik malt). Diesen Tip hattest Du mir ja im Prinzip mit der sauberen Trennung GUI / Steuerklasse auch schon gegeben ;)

Also nochmal vielen Dank und Gruß, schneubel

Ps: die von Dir genannt repain() Methode lerne ich auch immer mehr kennen :-)
 
Zurück