Expertenfrage zu Refresh nach hinzufuegen von Componeten?

Status
Nicht offen für weitere Antworten.
J

jago

Gast
Hi,

ich habe ein JPanel dem ich Componenten hinzufuege. Das hab ich schon zigmal gemacht nur will er diesmal nicht die Groesse des JPanel nach dem hinzufuegen anpassen obwohl ich folgendes aufrufe:

Code:
panel.invalidate();
panel.validate();
panel.repaint();

Lustigerweise reicht es aus das JFrame zu minimieren und wieder in den Vordergrund holen (eigentlich gibts dann nur ein repaint, oder?) um die von mir gewuenschte Groessenaenderung durchzufuehren.


Irgendwie sind parents von panel zu faul der Aenderung von meinem JPanel zu folgen und die Groesse von JPanel anzupassen. Nach vielem experimentieren habe ich festgestellt, dass ein:

Code:
panel.getParent().getParent().invalidate();
panel.getParent().getParent().validate();
panel.getParent().getParent().repaint();

den gewuenschten Effekt bringt und die Groesse von JPanel anpasst und ich nun alle hinzugefuegten Componenten sehe.


Kann mir jemand erklaeren was da passiert? Blockiert der weiter oben liegende Parent-Container dies oder was laeuft falsch wenn ich den Refresh-Vorgang direkt auf das panel ausfuehren will? Irgendwo wird vielleicht die Information dass neue Componenten hinzugefuegt wurden nicht weitergeleitet oder ignoriert?

Ich wuerde leiber gerne das Problem verstehen als zu diesem Hack zu greifen zumal ich nicht immer weiss der wievielte parent es ist und aus vielen anderen Gruenden.

Wie geht man einem solchen Problem nach? Wie detektieren die parents weiter oben normalerweise ob sie gelayouted werden muessen oder nicht?
 

Marco13

Top Contributor
Schau auch mal hier http://www.java-forum.org/de/viewtopic.php?p=363146#363146

Normalerweise sollte zumindest ein revalidate() alles notwendige erledigen, aber .... Niemand weiß, welche Strukturen du verwendest, WIE da WAS ineinander geschachtelt ist, welche LayoutManager du verwendest, und was du mit den PreferredSizes o.ä. machst, deswegen ist es schwierig, das was genaueres dazu zu sagen....
 
G

Guest

Gast
Marco13 hat gesagt.:
Schau auch mal hier http://www.java-forum.org/de/viewtopic.php?p=363146#363146

Normalerweise sollte zumindest ein revalidate() alles notwendige erledigen, aber .... Niemand weiß, welche Strukturen du verwendest, WIE da WAS ineinander geschachtelt ist, welche LayoutManager du verwendest, und was du mit den PreferredSizes o.ä. machst, deswegen ist es schwierig, das was genaueres dazu zu sagen....

Danke ich lese es gleich. nochmal zu den PreferredSizes. Ich habe schon gecheckt ob die sich von meinem JPanel aendert wenn ich Components hinzufuege. Das tut sie. Die PreferredSize wird groesser oder kleiner, abhaengig was ich nach einem removeAll() hinzufuege.



revalidate() scheint es uebrigens zu fixen - danke! Weisst du jetzt woran es lag. Normalerweise hab ich immer invalidate und dann validate aufgerufen und gut wars. Ich dachte immer revalidate wuerde intern genau das tun.



Selsam ist schon, dass wenn ich das Fenster minimiere und dann in den Vordergrund hole das Layout auch wieder gefixt wird. Wie kann man das erklaeren?


Gruss,
jago
 

Marco13

Top Contributor
Nochmal: Ich weiß nicht, WAS an deinem Layout nicht gestimmt hat, und woran das (bei dir) gelegen haben könnte. Aber... ganz grob und sinngemäß: validate() bezieht sich nur auf die Component, auf der es aufgerufen wurde, und revalidate() geht sozusagen die Hierarchie nach oben bis zum Frame, und validatet ALLES (macht also etwas, was auch beim Minimieren und Wiederherstellen gemacht wird)
 
J

jago

Gast
Marco13 hat gesagt.:
Nochmal: Ich weiß nicht, WAS an deinem Layout nicht gestimmt hat, und woran das (bei dir) gelegen haben könnte. Aber... ganz grob und sinngemäß: validate() bezieht sich nur auf die Component, auf der es aufgerufen wurde, und revalidate() geht sozusagen die Hierarchie nach oben bis zum Frame, und validatet ALLES (macht also etwas, was auch beim Minimieren und Wiederherstellen gemacht wird)

Ich hab schon das Javadoc von revalidate() gelesen und verstanden - sozusagen eine brute-force methode. Aber du hast recht, du kannst nicht wissen warum ein invalidate() gefolgt von einem repaint() nicht ausreicht.

http://www.java-forum.org/de/viewtopic.php?p=363146#363146 finde ich uebrigens teilweise Fehler und Unklarheiten. Javadocs scheinen besser. Habe schon von revalidate gehoert aber wieder vergessen was die so macht und mich auch nicht mehr erinnert.

Danke!
 
B

Beni

Gast
jago hat gesagt.:
http://www.java-forum.org/de/viewtopic.php?p=363146#363146 finde ich uebrigens teilweise Fehler und Unklarheiten. Javadocs scheinen besser. Habe schon von revalidate gehoert aber wieder vergessen was die so macht und mich auch nicht mehr erinnert.
Verbesserungen sind immer erwünscht, was für Fehler und Unklarheiten findest du?
 
G

Guest

Gast
Beni hat gesagt.:
jago hat gesagt.:
http://www.java-forum.org/de/viewtopic.php?p=363146#363146 finde ich uebrigens teilweise Fehler und Unklarheiten. Javadocs scheinen besser. Habe schon von revalidate gehoert aber wieder vergessen was die so macht und mich auch nicht mehr erinnert.
Verbesserungen sind immer erwünscht, was für Fehler und Unklarheiten findest du?

Ich finde jetzt den Fehler nicht. Aber bzgl. Unklarheiten finde ich die Art wie es geschrieben ist teilweise seltsam.

Bsp.: revalidate

Aufgabe: Zuerst invalidate aufrufen, und dafür sorgen, dass zu einem späteren Zeitpunkt validate aufgerufen wird.

Aufgabe: Zuerst invalidate aufrufen - klingt fuer mich so als waere es eine Anweisung an den Programmierer der revalidate nutzen will. Klar nachdem man sich an diesen Stil gewoehnt hat ist es kein Problem mehr. Allerdings kann man es auch einfacher ausdruecken:

Intera: revalidate ruft zunaechst invalidate auf und sorgt dafuer, dass zu einem späteren Zeitpunkt validate aufgerufen wird.


Versteh mich nicht falsch...ich finde es sehr gut das es so eine Liste gibt!
 
B

Beni

Gast
Hmok, das kann ich bei Gelegenheit mal anpassen. Ich habe mir damals nicht soviele Gedanken gemacht :wink:
 

André Uhres

Top Contributor
Validierung mit Swing

Hier ist eine etwas ausführlichere Beschreibung des Swing Validierungsmechanismus.

Das Herzstück des Swing Mal- und Validierungsmechanismus ist der RepaintManager.
Er ist dafür verantwortlich, daß die Mal- und Validierungsanträge zur AWT Event Queue geschickt werden, wo sie abgefertigt werden. Er macht dies, indem er die repaint() und revalidate() Anträge abfängt, wenn möglich irdendwelche Anträge zu einem einzigen zusammenfasst, sie in ein Runnable Objekt packt und an invokeLater weitergibt.

Ein revalidate() Antrag wird jedesmal erzeugt, wenn eine Komponente neu ausgelegt werden muss. Wenn ein Antrag von einer gewissen Komponente ankommt, muss man herausfinden können, ob das Auslegen dieser Komponente noch andere berührt. Die JComponent Methode "isValidateRoot()" gibt für die meisten Komponenten "false" zurück. Grundsätzlich ist der Aufruf dieser Methode gleichbedeutend mit der Frage: wenn ich deinen Inhalt neu auslege, kannst du mir garantieren, daß keiner deiner Vorfahren und Geschwister ungünstig beeinflusst wird (also neu ausgelegt werden muss)? Nur JRootPane, JScrollPane, und JTextField geben true als default Wert zurück. Das sind die einzigen Swing Komponenten, deren Inhalt in jeder Situation erfolgreich ausgelegt werden kann, ohne irgendwelche Vorfahren oder Geschwister zu berühren. Egal wie gross wir irgendwas innerhalb eines JRootPane, JScrollPane oder JTextField machen, wird sich ihre Grösse oder Position nicht ändern (ausser wenn ein Einfluss von ausserhalb mitspielt, also ein Geschwister oder Vorfahr).

Eine Komponente oder ihr Vorfahr wird gewöhnlich neu validiert, wenn der Wert einer Eigenschaft ändert, welche die Grösse, die Position oder das interne Layout dieser Komponente beeinflusst. Indem wir "isValidateRoot()" rekursiv auf dem Vorfahr einer Swing Komponente aufrufen, bis wir "true" erhalten, werden wir den nächsten Vorfahr dieser Komponente ermitteln, welcher uns garantiert, daß seine Validierung keinen seiner Geschwister oder Vorfahren ungünstig beeinflusst. Der RepaintManager stützt sich auf diese Methode um die Validierungsanträge abzufertigen.

Anmerkung: "Geschwister" sind Komponenten innerhalb desselben Containers. "Vorfahren" sind Container, die in derselben Containerhierarchie höher liegen.

Der RepaintManager führt einen Vector von Komponenten, die validiert werden müssen. Jedesmal wenn ein "revalidate" Antrag ankommt, wird die Auslöserkomponente an die addInvalidComponent() Methode geschickt und ihre "validateRoot" Eigenschaft wird mittels "isValidateRoot()" überprüft. Das geschieht rekurisv auf dem Vorfahr der Komponente, bis isValidateRoot() "true" zurückgibt. Die erreichte Komponente, falls eine da ist, wird auf Sichbarkeit überprüft. Wenn irgendeiner der Vorfahrcontainer nicht sichtbar ist, dann besteht kein Grund, zu validieren. Der RepaintManager prüft dann seinen Vector der nicht validen Komponenten und wenn die Rootkomponente noch nicht drin ist, wird sie hinzugefügt. Nachdem sie erfolgreich hinzugefügt wurde, übergibt der RepaintManager die Komponente an die Methode queueComponentWorkRequest() der Klasse SystemEventQueueUtilities. Diese Methode prüft ob schon ein dem Root entsprechender ComponentWorkRequest in der "work requests table" drin ist. Wenn schon einer da ist, holen wir uns lediglich die Referenz darauf. Dann synchronisieren wir den Zugang zu diesem ComponentWorkRequest, setzen ihn in die "work requests table", wenn es ein neuer ist, und prüfen, ob er schon ansteht (d.h. er wurde zur AWT Event Queue hinzugefügt). Wenn er noch nicht ansteht, schicken wir ihn an SwingUtilities.invokeLater(). Er wird dann als "anstehend" gekennzeichnet und wir verlassen den synchronisierten Abschnitt. Wenn er schliesslich auf dem "event-dispatching thread" ausgeführt wird, teilt er dem RepaintManager mit, er soll validateInvalidComponents() ausführen, gefolgt von paintDirtyRegions().
Die Methode validateInvalidComponents() prüft grundsätzlich den Vector der Komponenten, die validiert werden müssen, und ruft validate() auf jedem davon auf.

Hier ist noch ein Artikel, der speziell die Swing Malmechanismen erklärt: Malen in AWT und Swing
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Objekte refresh AWT, Swing, JavaFX & SWT 3
J TableView Update/Refresh CPU AWT, Swing, JavaFX & SWT 2
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Stage reload, refresh ... AWT, Swing, JavaFX & SWT 3
D ComboBoxCellEditor Refresh beim Focus AWT, Swing, JavaFX & SWT 4
T JTable Cell Refresh AWT, Swing, JavaFX & SWT 5
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
C SWT refresh einer Tabelle AWT, Swing, JavaFX & SWT 4
J SWT Globale Refresh-Aktion programmtechnisch aufrufen AWT, Swing, JavaFX & SWT 6
L Probleme beim Refresh von JTable AWT, Swing, JavaFX & SWT 7
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
K SWT TableViewer refresh() im Dialog AWT, Swing, JavaFX & SWT 2
M JRadioButton refresh AWT, Swing, JavaFX & SWT 5
M SWT grabExcessHorizontalSpace update ? refresh ? AWT, Swing, JavaFX & SWT 6
S Refresh von JTableModel funktioniert nur ein Mal AWT, Swing, JavaFX & SWT 4
D JList, JTree, JTextarea - Daten"refresh" AWT, Swing, JavaFX & SWT 15
L JFrame Refresh-Problem AWT, Swing, JavaFX & SWT 4
A Refresh JPanel AWT, Swing, JavaFX & SWT 6
R Refresh Label AWT, Swing, JavaFX & SWT 4
dzim NullPointer bei refresh() einer JFace TableViewer AWT, Swing, JavaFX & SWT 2
Lazybone JTree refresh Problem AWT, Swing, JavaFX & SWT 3
X Focusproblem beim Refresh eines jLabels AWT, Swing, JavaFX & SWT 4
F Paint-Methode Überschreiben macht Refresh-Fehler ? AWT, Swing, JavaFX & SWT 8
D jTabbedPane refresh AWT, Swing, JavaFX & SWT 2
S Display Refresh AWT, Swing, JavaFX & SWT 2
X Refresh eines Frames AWT, Swing, JavaFX & SWT 1
P JFrame refresh AWT, Swing, JavaFX & SWT 2
m@nu JTree: Äste nach refresh wiederherstellen AWT, Swing, JavaFX & SWT 3
M Wi mache ich einen refresh AWT, Swing, JavaFX & SWT 4
C GUI-Refresh funktioniert nicht AWT, Swing, JavaFX & SWT 3
D JList Refresh AWT, Swing, JavaFX & SWT 19
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
H JavaFX Fenstergröße nach maximieren erkennen AWT, Swing, JavaFX & SWT 6
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
T ListView nach Erweiterung Fehler in CellFactory AWT, Swing, JavaFX & SWT 8
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
VPChief Nach abspielen von Sound reagiert das Program nichtmehr AWT, Swing, JavaFX & SWT 9
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
S JavaFX Slider freezt nach Benutzung AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
F JavaFX Zustand der CheckMenuItems behalten nach Programmneustart AWT, Swing, JavaFX & SWT 7
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
stroggi Swing Suche nach Kurveneditor (UI-Element) AWT, Swing, JavaFX & SWT 1
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
L JTextField erscheint erst nach Veränderung der Framegröße AWT, Swing, JavaFX & SWT 5
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
F AWT Robot Klasse Screenshot nach Pixelmustern in bestimmten Radius um Bildschirmmittelpunkt absuchen AWT, Swing, JavaFX & SWT 13
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
L JavaFX Java FX Anwendung nach MVC mit Observer Pattern AWT, Swing, JavaFX & SWT 15
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
MrSnake Tabelle nach 2 Strings Filtern AWT, Swing, JavaFX & SWT 3
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
T Swing Tabelle mit Button - Anzeigefehler nach Zeile entfernen AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben