Reglas Generales para el uso de Componentes Swing

Esta página tiene información general sobre cómo escribir un programa que contenga componentes Swing. Dos cosas importantes a tener en cuenta son evitar el uso de componentes de peso pesado que no sean Swing y poner nuestros componentes Swing dentro de un contenedor de alto nivel.

El paquete Swing define dos tipos de componentes:

Los contenedores de alto nivel proporcionan el marco de trabajo en el que existen los componentes de peso ligero. Específicamente, un contenedor de alto nivel Swing proporciona un área en el que los componentes de peso ligero Swing pueden dibujarse a sí mismos. Los contenedores de alto nivel Swing también proporcionan otras características Swing como el espacio para una barra de menú, manejo avanzado de eventos y dibujo, y soporte de accesibilidad.

En general, todo componente Swing debería tener un contenedor Swing de alto nivel por encima en el árbol de contenidos. Por ejemplo, todo applet que contenga componentes Swing debería estar implementado como una subclase de JApplet (que es una subclase de Applet). De forma similar, toda ventana principal que contenga componentes Swing debería ser implementada con un JFrame.

Aquí tenemos una imagen del árbol de contentido de un GUI de un típico programa Swing que implementa una ventana que contiene dos botones, un campo de texto y una lista:

Aquí tenemos otra imagen del mismo GUI excepto en que ahora es un Applet ejecutándose en un navegador:
El panel de contenido de las figuras anteriores es el Contenedor normal que hay debajo de cada contenedor Swing. Un contenedor de alto nivel Swing es una subclase Swing de un componente AWT de peso pesado. Los contenedores de alto nivel Swing le añaden las necesidades Swing -- incluyendo un panel de contenido -- a los componentes pesados del AGM.

Aquí está el código que construye el GUI mostrado en las figuras anteriores:

//Configura el JPanel,que contiene el campo de texto y la lista.
JPanel panel = new JPanel();
panel.setLayout(new SomeLayoutManager());
panel.add(textField);
panel.add(list);

//topLevel es un ejemplar de JApplet o JFrame
Container contentPane = topLevel.getContentPane();
contentPane.setLayout(new AnotherLayoutManager());
contentPane.add(button1);
contentPane.add(button2);
contentPane.add(panel);

Nota:No se pueden añadir directamente los componentes a un componente de alto nivel:
    topLevel.add(something);  //NO SE PUEDE HACER ESTO!!!

En general, deberíamos evitar el uso de componentes pesados en GUIs Swing (excepto los contenedores de alto nivel Swing que contienen el GUI, por supuesto). El problema más obsevable cuando se mezclan componentes pesados y ligeros es que cuando se solapan dentro de un contenedor, el componente de peso pesado siempre se dibuja encima del componente de peso ligero. Puedes ver Mezclar Componentes Pesados y Ligeros en la "Swing Connection" para más información sobre la mezca de los dos tipos de componentes.

Ozito