LayoutManager Erst layouten, dann zeichnen

mariog86

Neues Mitglied
Hallo

Nachdem ich dem GridBagLayout manager endlich beibringen konnte, wie er meine Komponenten richtig layouten soll, ist mir ein Problem beim Anzeigen aufgefallen.
Ich habe in meiner Applikation eine Art Assistent, durch den man sich mit einem Weiter Button durchklicken kann. Dies ist so gelöst, dass ich bei einem Klick auf weiter jeweils das ensprechende JPanel dem übergeordneten JPanel hinzufüge und das vorhergehende entferne. Das Problem ist nun, dass Swing sobail ich auf dem übergeordneten Panel repaint() aufrufe, was nötig ist, da die Anzeige sonst nicht korrekt aktualisiert wird, zuerst alle Komponenten zeichnet, dann die Komponenten layoutet und dann nochmal zeichnet. Dies führt dazu, dass man sieht wie die Komponenten vom LayoutManager verschoben und geresized werden.
Ich habe schon versucht mit doLayout() und validate() ein Layout durchzuführen bevor ich repaint() aufrufe. Dies scheint aber wirkungslos zu sein. Wenn ich einen Breakpoint beim Component resize event setze und einen bei paintComponent, kann ich sehen, wie zuerst paint component aufgerufen wird und alles gezeichnet wird anhand der ursprünglichen grösse des Panels.
Danach wird das resize event aufgerufen, worauf alle Grössen und Positionen korrekt gesetzt werden und durch einen weiteren Aufruf von paintComponent dann auch korrekt dargestellt werden.
Ich habe schon versucht die JPanels in einem CardLayout abzulegen, in der Hoffnung dass sie bereits gelayoutet werden, wenn ich sie zum CardLayout hinzufüge. Ausserdem habe ich versucht sie zuerst invisible zu setzen zu repainten und dann wieder auf visible zu setzen. Es nützt aber alles nichts die Komponenten werden erst gelayoutet nachdem sie schon einmal gezeichnet wurden.
Wie kann ich Swing dazu bringen erst alles fertig zu layouten und erst dann zu zeichnen?
 
Mach mal ein KSKB, dass hab ich ja noch nie gesehen...
Für sowas würde ich auch ein CardLayout verwenden...
 
Ich habe es auch nach mehreren Stunden nicht geschafft ein KSKB zu erstellen, dass den Fehler reproduziert.
Ich kann mir aber vorstellen, dass das Problem irgendwie damit zusammenhängt, dass ich gewisse Layoutinformationen neu berechnen muss, wenn die Komponente geresized wird, z.B. wird der Rahmen umso breiter je grösser die Fläche, ebenfalls die Schriften und Buttons.
Diese Informationen berechne ich im ComponentEvent wenn es die ID COMPONENT_RESIZED hat. Das Problem ist nun wahrscheinlich, dass dieses Event nicht sofort aufgerufen wird, wenn die Grösse vom Layoutmanager geändert wurde, sondern irgendwann später. Leider konnte ich nirgendo herausfinden wann genau der Event ausgelöst wird und ob es immer vor paintComponent ausgelöst wird.
Wenn ich direkt setSize überbreibe und die Berechnungen dort mache, tritt das Problem jedenfalls nicht auf. Allerdings finde ich diese Variante nicht sehr sauber, da setSize ja nicht die einzige Möglichkeit ist, die Grösse zu setzen. Gibt es keine bessere Möglichkeit sofort und vor Aufruf von paintComponent über eine Grössenänderung informiert zu werden?
 
Dann musst du wohl deinen Code umbauen wenn das KSKB funktioniert...
Kommentier stückweise deinen Code aus bis der Fehler nicht mehr kommt dann weißt du wo das Problem ist.
Oder du versuchst es erst einmal mit debugen.
 

Zurück
Oben