Ich stelle eine Swing-Anwendung zusammen, in der ich häufig den Inhalt eines JPanel ersetzen möchte. Dazu rufe ich an removeAll()
, füge meinen neuen Inhalt hinzu und rufe dann an revalidate()
.
Ich stelle jedoch fest, dass der alte Inhalt tatsächlich noch sichtbar ist (obwohl er durch den neuen Inhalt verdeckt wird). Wenn ich einen Anruf hinzuzufügen , repaint()
zusätzlich zu revalidate()
, es funktioniert wie erwartet.
Ich bin mir sicher, dass ich bei anderen Gelegenheiten erlebt habe, dass revalidate()
es ausreicht , nur anzurufen .
Meine Frage lautet also im Grunde: Soll ich beide Funktionen aufrufen müssen und wenn nicht, wann soll ich jede aufrufen?
Antworten:
Sie müssen anrufen
repaint()
undrevalidate()
. Ersteres sagt Swing, dass ein Bereich des Fensters schmutzig ist (was notwendig ist, um das Bild der alten Kinder zu löschen, die von entfernt wurdenremoveAll()
); Letzteres weist den Layout-Manager an, das Layout neu zu berechnen (was beim Hinzufügen von Komponenten erforderlich ist). Dies sollte dazu führen , Kinder der Platte neu zu zeichnen, kann aber nicht dazu führen , das Panel selbst , dies zu tun (siehe dies für die Liste des Repaint Trigger).Allgemeiner gesagt: Anstatt das ursprüngliche Panel wiederzuverwenden, würde ich empfehlen, ein neues Panel zu erstellen und es beim übergeordneten Panel auszutauschen.
quelle
Jedes Mal, wenn Sie remove () oder removeAll () ausführen, sollten Sie aufrufen
Nachdem Sie das Hinzufügen () der neuen Komponenten abgeschlossen haben.
Das Aufrufen von validate () oder revalidate () ist obligatorisch, wenn Sie remove () ausführen - siehe die entsprechenden Javadocs.
Meine eigenen Tests zeigen, dass repaint () ebenfalls notwendig ist. Ich weiß nicht genau warum.
quelle
revalidate
wird für einen Container aufgerufen, sobald neue Komponenten hinzugefügt oder alte entfernt wurden. Dieser Aufruf ist eine Anweisung, den Layout-Manager anzuweisen, basierend auf der neuen Komponentenliste zurückzusetzen.revalidate
löst einen Aufruf aus, um neu zu malen, was die Komponente für "schmutzige Regionen" hält. Offensichtlich werden nicht alle Regionen auf Ihrer SeiteJPanel
von der als schmutzig angesehenRepaintManager
.repaint
wird verwendet, um eine Komponente anzuweisen, sich selbst neu zu streichen. Es ist häufig der Fall, dass Sie dies aufrufen müssen, um Bedingungen wie Ihre zu bereinigen.quelle
revalidate()
Fordern Sie einfach das Layout des Containers an. Wenn Sierevalidate()
festgestellt haben, dass einfach Aufrufe ausgeführt werden , kann dies durch die Aktualisierung der untergeordneten Komponentengrenzen verursacht werden, die ausgelöst werden,repaint()
wenn ihre Grenzen während des erneuten Layouts geändert werden. Im Fall , dass Sie erwähnten, nur Komponente entfernt und keine Komponente Grenzen verändert wird , ist dieser Fall nichtrepaint()
ist „versehentlich“ ausgelöst.quelle
Ja, Sie müssen repaint () aufrufen. revalidate (); Wenn Sie removeAll () aufrufen, müssen Sie repaint () und revalidate () aufrufen.
quelle