Swing y JFC (Java Foundation Classes)

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.

  1. El contenedor de alto nivel, JFrame, se dibuja as s� mismo.
  2. 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.
  3. 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.
  4. 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.
  5. 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|.=
=.---------.=
=============

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR