Hallo Leute
Ich habe einen JFrame in dem mehrere Komponenten eingebettet sind. Durch Benutzerinteraktion
sollen verschiedene Komponenten versteckt und andere dafür angezeigt werden. Das klappt ja
grundsätzlich wunderbar.
Problem ist nun aber, dass die Anzeige ziemlich grob „flimmert“ (man kann dabei zusehen, die
die einzelnen Komponenten verschwinden bzw. erscheinen und wie der Layoutmanager die
Komponenten neu ausrichtet). Das ganze sieht ziemlich unschön aus.
Von anderen Programmiersprachen kenne ich eine Funktion „setRedraw(false)“ die verhindert,
dass der Frame während einer bestimmen Zeit neu gezeichnet wird. Man kann also im
Hintergrund alle Komponenten verändern, was dann auch recht flott geht. Sobald man fertig
ist, ruft man wiedre „setRedraw(true)“ auf und der neue Frameinhalt wird fast ohne
Verzögerung angezeigt.
Gibt es eine ähnliche Funktion im Java/Swing? Das ganze sollte aber auch mit JDK 1.3.0 noch
laufen…
Erwin
Moin
Von anderen Programmiersprachen kenne ich eine Funktion
„setRedraw(false)“ die verhindert,
dass der Frame während einer bestimmen Zeit neu gezeichnet
wird.
kann man durch überschreiben von „void update(Graphics g)“ erreichen. Die Methode wird vor jedem neuzeichen aufgerufen. Darin wird normalerweise die Anzeige gelöscht. (nach dem „wiedereinschalten“ der GUI muss man noch ein „repaint()“ hinterher schicken.)
oder das Ding zu DoubleBuffering überreden (geht nicht mit dem normalen JFrame aus dem 1.3.0 (isDoubleBuffered ())
Man kann also im
Hintergrund alle Komponenten verändern, was dann auch recht
flott geht. Sobald man fertig
ist, ruft man wiedre „setRedraw(true)“ auf und der neue
Frameinhalt wird fast ohne
Verzögerung angezeigt.
wie genau fügts du die neuen Komponenten hinzu ? (poste mal Codeteile) und in welchem thread (awt-event-Thread oder ein anderer) ?
Gibt es eine ähnliche Funktion im Java/Swing?
Eigentlich macht swing das selbst relativ inteligent. Beim hinzufügen wird ein Timer gestartet (etwa 50ms). Wenn sich vor Ablauf des Timers an den Containern (Frame, JFrame, Window) was ändert wird noch ein bisschen länger gewaret. Dieses Warten kann man aber mit einem schlecht plaziertem „repaint()“ oder „validate()“ unterbrechen, und damit swing zum flimmern bringen.
Allerdings ist das Warten nicht Teil der Core-Def. von swing, so dass JVM’s die nicht von sun oder Blackdown stammen sich auch nicht daran halten müssen (Stichwort: M$ falls die VM jemals aus dem Beta-status rauskommt).
cu
Danke, die Info reicht mir vorerst.
Erwin