Podr�as no necesitar la informaci�n de esta secci�n, en absoluto. Sin embargo, si tus componentes parece que no se dibujan correctamente, entender los conceptos de esta secci�n podr�a ayudarte a ver qu� hay err�neo. De igual modo, necesitar�s entender esta secci�n si creas c�digo de dibujo personalizado para un componente.
�C�mo funciona el dibujo
Cuando un GUI Swing necesita dibujarse a s� mismo -- la primera vez, o en respuesta a la vuelta de un ocultamiento, o porque necesita reflejar un cambio en el estado del programa -- empieza con el componente m�s alto que necesita ser redibujado y va bajando por el �rbol de contenidos. Esto est� orquestado por el sistema de dibujo del AWT, y se ha hecho m�s eficiente mediante el manejador de dibujo de Swing y el c�digo de doble buffer.
Los componentes Swing generalmente se redibujan a s� mismos siempre que es necesario. Por ejemplo, cuando llamamos al m�todo setText de un componente, el c�mponente deber�a redibujarse autom�ticamente a s� mismo, y si es necesario, redimensionarse. Si no lo hace as� es un bug. El atajo es llamar al m�todo repaint sobre el componente para pedir que el componente se ponga en la cola para redibujado. Si se necesita cambiar el tama�o o la posici�n del componente pero no autom�ticamente, deber�amos llamar al m�todo revalidate sobre el componente antes de llamar a repaint.
Al igual que el c�digo de manejo de eventos, el c�digo de dibujo se ejecuta en el thread del despacho de eventos. Mientras se est� manejando un evento no ocurrir� ning�n dibujo. De forma similar, si la operaci�n de dibujado tarda mucho tiempo, no se manejar� ning�n evento durante ese tiempo.
Los programas s�lo deber�an dibujarse cuando el sistema de dibujo se lo diga. La raz�n es que cada ocurrencia de dibujo de un propio componente debe ser ejecutado sin interrupci�n. De otro modo, podr�an ocurrir resultados imprecedibles. como que un bot�n fuera dibujado medio pulsado o medio liberado.
Para acelerar, el dibujo Swing usa doble-buffer por defecto -- realizado en un buffer fuera de pantalla y luego lanzado a la pantalla una vez finalizado. Podr�a ayudar al rendimiento si hacemos un componente Swing opaco, para que el sistema de dibujo de Swing pueda conocer lo que no tiene que pintar detr�s del componente. Para hacer opaco un componente Swing, se llama al m�todo setOpaque(true) sobre el componente.
Los componentes no-opacos de Swing puede parecer que tienen cualquier forma, aunque su �rea de dibujo disponible es siempre rectangular. Por ejemplo, un bot�n podr�a dibujarse a s� mismo dibujando un oct�gono relleno. El componente detr�s del bot�n, (su contenedor, comunmente) ser�a visible, a trav�s de las esquinas de los lados del bot�n. El bot�n podr�a necesitar incluir c�digo especial de detecci�n para evitar que un evento action cuando el usuario pulsa en las esquinas del bot�n.
�Un Ejemplo de Dibujo
Para ilustrar el dibujado, usaremos el programa SwingApplication, que se explic� en Una Ruta R�pida a trav�s del C�digo de una Aplicaci�n Swing. Aqu� podemos ver el GUI de SwingApplication.

Y aqu� su �rbol de contenidos.
JFrame (a top-level container) | ... | content pane | JPanel | +----------------+ | | JButton JLabel
Aqu� est� lo que sucede cuando se dibuja el GUI de SwingApplication.
- El contenedor de alto nivel, JFrame, se dibuja as s� mismo.
- El panel de contenido primero dibuja su fondo, que es un rect�ngulo s�lido de color gris. Luego le dice al JPanel que se dibuje el mismo. El rect�ngulo del panel de contenido realmente no aparece en el GUI finalizado porque est� oscurecido por el JPanel.
Nota: Es importante que el panel de contenido sea opaco. De otro modo, resultar� en dibujados confusos. C�mo el JPanel es opaco, podemos hacer que sea el panel de contenido (sustituyendo setContentPane por el c�digo existente getContentPane().add). Esto simplifica considerablemente el �rbol de contenidos y el dibujado, eliminado un contenedor innecesario. - El JPanel primero dibuja su fondo, un rect�ngulo s�lido de color gris. Luego dibuja su borde. Esl borde es un EmptyBorder, que no tendr� efecto excepto para incrementar el tama�o del JPanel reservando alg�n espacio extra en los laterales del panel. Finalmente, el panel le pide a sus hijos que se dibujen a s� mismos.
- Para dibujarse a s� mismo, el JButton dibuja su rect�ngulo de fondo si es necesario y luego dibuja el texto que contiene. Si el bot�n tiene el foco del teclado, significa que cualquier cosa que se teclee va directamente al bot�n para su procesamiento, luego el bot�n realiza alg�n dibujado espec�fico del Aspecto y Comportamiento para aclarar que tiene el foco.
- Para dibujarse a s� misma, la JLabel dibuja su texto.
De este modo, cada componente se dibuja a s� mismo antes de que lo haga cualquier componente que contenga, Esto asegura que el fondo de un JPanel, por ejemplo, s�lo se dibuja cuando no est� cubierto por uno de los componentes que contiene. La siguiente figura ilustra el orden en que cada componente que desciende de JComponent se dibuja a s� mismo.
1. fondo (si es opaco) |
2. dibujo personalizado (si existe) |
3. borde (si existe) |
4. hijos (si existen) |
---|---|---|---|
............. ............. ............. ............. ............. ............. |
............. ....()....... ............. ............. ............. ............. |
============= =...()......= =...........= =...........= =...........= ============= |
============= =...()......= =.---------.= =.|JButton|.= =.---------.= ============= |