2012-05-28 3 views
10

Ich habe es auf dieser Website mehrmals (wie here und here) geschrieben, dass Sie setVisible(true) vor dem Hinzufügen von Komponenten zu einem JComponent nicht aufrufen müssen, aber ich habe keine Erklärung und Informationen über die Internet scheint knapp.Warum sollte ich setVisible (true) nicht vor dem Hinzufügen von Komponenten aufrufen?

Warum ist das der Fall, und was passiert, wenn Sie die Regel brechen?

+0

können Sie eine Quelle angeben, wo sie das gesagt haben? –

+1

Vom visuellen Standpunkt aus erscheint es schlampig, eine Komponente zu sehen, der immer noch neue Dinge hinzugefügt werden (es sei denn, dies ist natürlich das erwartete Verhalten des Benutzers). – Jeffrey

Antwort

19

Sie brechen nichts, wenn Sie es zuerst anrufen, aber Sie müssen wahrscheinlich dann erneut anrufen, wenn Sie etwas hinzugefügt haben. Else Swing rendert die hinzugefügten Komponenten nicht. Sie müssen die JVM die Methode paint(...) des JFrames aufrufen lassen, damit die JFrame-Komponenten gerendert werden, und setVisible(true) wird die JVM bitten, genau dies zu tun. Wenn Sie nach dem Aufrufen von setVisible (true) Komponenten hinzufügen und die Komponenten nicht sehen, werden Sie feststellen, dass sie sich bei der Größenanpassung des JFrame "materialisieren". Der Grund dafür ist, dass das Betriebssystem Swing dazu veranlasst, die GUI neu zu zeichnen, was dazu führt, dass paint(...) aufgerufen wird.

Beachten Sie, dass Sie beim Hinzufügen einer Komponente nach dem Erstellen Ihrer GUI revalidate() und oft repaint() auf ihrem Container aufrufen können, um die neue Komponente richtig zu erstellen und dann zu rendern. Die repaint() wird definitiv notwendig sein, wenn die Änderung in Komponenten eine Löschung beinhaltet, oder eine Komponente gezeichnet wird, wo eine andere Komponente zuvor visualisiert wurde.

Ein Buch Vorschlag, dass ich sehr empfehlen: Filthy Rich Clients kaufen Guy und Haase. Kauf es einfach! Sie werden den Kauf nicht bereuen.

7

Amplifying on @ Hovercraft hilfreiche Analyse, müssen Sie möglicherweise auch pack() die umschließende Top-Level-Container. Diese example, die Elemente zu einer JList nach setVisible() hinzufügt, kann die Kompromisse veranschaulichen.

Verwandte Themen