2012-05-28 13 views
10

Lo he visto escrito en este sitio varias veces (como here y here) que no debe llamar al setVisible(true) antes de agregar componentes a JComponent, pero no he visto una explicación e información sobre el Internet parece escaso.¿Por qué no debería llamar a setVisible (verdadero) antes de agregar componentes?

¿Por qué es este el caso, y qué pasa si se rompe la regla?

+0

¿Puedes poner una fuente donde dijeron eso? –

+1

Desde un punto de vista visual, ver un componente que todavía tiene cosas nuevas agregadas parece descuidado (a menos que, por supuesto, este comportamiento sea esperado por el usuario). – Jeffrey

Respuesta

19

No está rompiendo nada si lo llama primero, pero es probable que deba volver a llamar si ha agregado algo. Else Swing no representará los componentes agregados. Es necesario que JVM llame al método paint(...) de JFrame para que se procesen los componentes del JFrame, y setVisible(true) le solicitará a la JVM que haga exactamente esto. Si alguna vez ha agregado componentes después de llamar a setVisible (verdadero) y no ve los componentes, encontrará que se "materializarán" si reajusta el tamaño del JFrame. Esto se debe a que el redimensionamiento hace que el sistema operativo solicite a Swing volver a pintar la GUI, y esto dará como resultado que se llame al paint(...).

Tenga en cuenta que si agrega un componente después de crear su GUI, puede llamar al revalidate() y con frecuencia al repaint() en su contenedor para obtener el nuevo componente distribuido correctamente y luego renderizado. El repaint() será definitivamente necesario si el cambio en los componentes implica una eliminación, o si un componente se dibujó en otro componente que se visualizó previamente.

Una sugerencia libro que altamente recomiendo: Filthy Rich Clients comprar Guy y Haase. ¡Sólo comprarlo! No te arrepentirás de la compra.

7

Amplificando el útil análisis de @Hovercraft, también puede tener que volver a pack() el contenedor de nivel superior adjunto. Este example, que agrega elementos a JList después de setVisible(), puede ilustrar las compensaciones.

Cuestiones relacionadas