## El Árbol de Componentes

El Programa de Ejemplo tiene varios niveles de herencia en el árbol de componnetes. El padre de cada nivel es un contenedor (que desciende de Component). Abajo tienes una figura de la herencia. >

                                 un Frame
                                    |
                                   ...
                                    |
                               un Converter
                                    |
                    ----------------------------------
                    |                                |
     un ConversionPanel (metricPanel)  un ConversionPanel (usaPanel)
                    |                                |
           -------------------              -------------------
           |        |        |              |        |        |
        un Label    |      un Choice   un Label      |    un Choice
                    |                                |
              --------------                  ---------------
              |            |                  |             |
        un TextField  un Scrollbar      un TextField    un Scrollbar

### Explicación

> En la parte superior de la herencia esta la ventana (ejemplar de Frame) que muestra el programa. Cuando el programa de ejemplo se ejecuta como una aplicación, el Marco se crea dentro del método main(). Cuando el ejemplo se ejecuta como un applet dentro de un navegador, el Marco es la ventana del navegador.

> Debajo del Frame esta un objeto Converter, que desciende de la clase Applet y que es un Contenedor (especificamente, un Panel). Dependiendo el visualizador en que se esté mostrando el applet, podría haber uno o más contenedores entre el objeto Converter y el Frame de la parte superior del árbol de herencia.

> Directamente debajo del objeto Converter hay dos ConversionPanel. El siguiente código los pone debajo del Converter, utilizando el método add(). La clase Converter hereda el método add() de la clase Container (Converter desciende de la clase Applet, que a su vez desciende de la clase Panel, que a su vez desciende de la clase Container).

>     public class Converter extends Applet {
>         . . .
>         public void init() {
>             ...//Crea metricPanel y usaPanel, que son dos ConversionPanels.
>             add(metricPanel);
>             add(usaPanel);
>             . . .
>         }

Cada ConversionPanel tiene cuatro hijos: un Label, un TextField, un Scrollbar, y un Choice. Aquí tienes el código para añadir estos niños:

    class ConversionPanel extends Panel {
        . . .
        ConversionPanel(Converter myController, String myTitle, Unit myUnits[]) {
            . . .
            //Añade la etiqueta. Muestra este título de panel, centado
            Label label = new Label(myTitle, Label.CENTER);
            ...//Selecciona GridBagConstraints para este componente Component.
            gridbag.setConstraints(label, c);
            add(label);

            //Añade el campo de texto. Inicialmente mustra "0" y necesita ser de al menos
            //10 caracteres de ancho.
            textField = new TextField("0", 10);
            ...//Selecciona GridBagConstraints para este Component.
            gridbag.setConstraints(textField, c);
            add(textField);

            //Añade la lista desplegable (Choice).
            unitChooser = new Choice();
            ...//Genera los items de la lista.
            ...//Selecciona GridBagConstraints para este Component.
            gridbag.setConstraints(unitChooser, c);
            add(unitChooser);

            //Añade la barra deslizadora. Es horizontal, su valor inicial es 0.
            //un  click incrementa el valor 100 pixels, y tiene especificados los valores
            //mínimo y máximo especificados por las variables del ejemplar min y max.
            slider = new Scrollbar(Scrollbar.HORIZONTAL, 0, 100, min, max);
            ...//Selecciona GridBagConstraints para este Component.
            gridbag.setConstraints(slider, c);
            add(slider);
        }

GridBagConstraints es un objeto que le dice a GridBagLayout (El controlador de disposición para cada ConversionPanel) como colocar un componente particular. GridBagLayout, junto con los otros controladores de disposición del AWT se explican en Distribuir Componentes dentro de un Contenedor.

### Sumario

> La herencia de Componentes del programa de ejemplo contiene ocho componentes que no son contenedores -- componentes que representan el UI gráfico del programa. Estos son las etiquetas, los campos de texto, las elecciones y las barras de desplazamiento que muestra el programa. Podría haber componentes adicionales como controles de ventana bajo el marco.

> Este árbol de componentes tiene al menos cuatro contenedores -- un Frame (ventana), un Converter (una clase cliente de Panel), y dos ConversionPanels (otros dos Paneles del Cliente).

> Observa que si añadimos una ventana -- por ejemplo, un Frame que contiene un ejemplar de Converter que maneje la conversión de distancias -- la nueva ventana tendrá su propio árbol de herencia, totalmente independiente del árbol de herencia que presenta esta lección.

Ozito