## Los Componentes Swing y el Árbol de Contenidos

Esta sección presenta algunos de los componentes más utilizados de Swing y explica como los componentes de un GUI entran juntos en un contenedor. Para ilustrarlo, usaremos el programa SwingApplication presentado en Una Ruta Rápida por el Código de una Aplicación Swing. Y aquí está su aspecto de nuevo:

SwingApplication crea cuatro componentes Swing muy utilizados:

- un frame, o ventana principal (JFrame)
- un panel, algunas veces llamado pane (JPanel)
- un botón (JButton)
- una etiqueta (JLabel)

El frame es un contenedor de alto nivel. Existe principalmente para proporcionar espacio para que se dibujen otros componentes Swing. Los otros contenedores de alto nivel más utilizados son los diálogos (JDialog) y los applets (JApplet).

El panel es un contenedor intermedio. Su único propósito es simplificar el posicionamiento del botón y la etiqueta. Otros contenedores intermedios, como los paneles desplazables, (JScrollPane) y los paneles con pestañas (JTabbedPane), típicamente juegan un papel más visible e interactivo en el GUI de un programa.

El botón y la etiqueta son componentes atómicos -- componentes que existen no para contener otros componentes Swing, sino como entidades auto-suficientes que representan bits de informaión para el usuario. Frecuentemente, los componentes atómicos también obtienen entrada del usuario. El API Swing proporciona muchos componentes atómicos, incluyendo combo boxes (JComboBox), campos de texto (JTextField), y tablas (JTable).

Aquí podemos ver un diágrama con el árbol de contenidos de la ventana mostrada por SwingApplication. Este diágrama muestra todos los contenedores creados o usados por el programa, junto con los componentes que contienen. Observa que si añadimos una ventana -- por ejemplo, un diálogo -- la nueva ventana tendría su propio árbol de contenidos, independiente del mostrado en esta figura.

                            JFrame (un contenedor de algo nivle)
                              |
                             ...
                              |
                        panel de contenido
                              |
                            JPanel
                              |
                      +----------------+
                      |                |
                   JButton          JLabel

Como muestra la figura, incluso el programa Swing más sencillo tiene múltiples niveles en su árbol de contenidos. La raíz del árbol de contenidos es siempre un contenedor de alto nivel. Este contenedor proporciona espacio para que sus componentes Swing descendentes se dibujen a sí mismo.

> Truco: Para ver el árbol de contenidos de cualquier frame o diálogo, pulsa el borde para seleccionarlo y pulsa Control-Shift-F1. Se escribirá una lista con el árbol de contenidos en el stream de salida estándard.

Todo contenedor de alto nivel contiene indirectamente un contenedor intermedio conocido como panel de contenido. Para la mayoría de los programas no necesitas saber qué pasa entre el contenedor de alto nivel y su panel de contenido. (Si realmente quieres verlo, puedes ver Cómo usar Paneles Raíz.)

Cómo regla general, el panel de contenido contiene, directamente o indirectamente, todos los componentes visibles en el GUI de la ventana. La gran excepción a esta regla es que si el contenedor de alto nivel tiene una barra de menú, entonces ésta se sitúa en un lugar especial fuera del panel de contenido.

Para añadir componentes a un contenedor, se usa una de las distintas formas del método add. Este método tiene al menos un argumento -- el componente a añadir. Algunas veces se requiere un argumento adicional para proporcionan información de distribución. Por ejemplo, la última línea del siguiente código de ejemplo especifica que el panel debería estar en el centro de su contenedor (el panel de contenido).

    frame = new JFrame(...);
    button = new JButton(...);
    label = new JLabel(...);
    pane = new JPanel();
    pane.add(button);
    pane.add(label);
    frame.getContentPane().add(pane, BorderLayout.CENTER);

Para ver todos los componentes Swing puedes ir a la página Un índice visual de los Componentes Swing.

Ozito