##
CONTENEDORES

Container es una clase abstracta derivada de Component, que representa a cualquier componente que pueda contener otros componentes. Se trata, en esencia, de añadir a la clase Component la funcionalidad de adición, sustracción, recuperación, control y organización de otros componentes.

El AWT proporciona cuatro clases de Contenedores:

- Window
- Frame
- Dialog
- Panel

Además de estos Contenedores, la clase Applet también es un Contenedor, es un subtipo de la clase Panel y puede tener Componentes.

### Window

Es una superficie de pantalla de alto nivel (una ventana). Una instancia de la clase Window no puede estar enlazada o embebida en otro Contenedor. Una instancia de esta clase no tiene ni título ni borde.

### Frame

Es una superficie de pantalla de alto nivel (una ventana) con borde y título. Una instancia de la clase Frame puede tener una barra de menú. Una instancia de esta clase es mucho más aparente y más semejante a lo que nosotros entendemos por ventana.

### Dialog

Es una superficie de pantalla de alto nivel (una ventana) con borde y título. Una instancia de la clase Dialog no puede existir sin una instancia asociada de la clase Frame.

### Panel

Es un Contenedor genérico de Componentes. Una instancia de la clase Panel, simplemente proporciona un Contenedor al que ir añadiendo Componentes.

### Crear un Contenedor

Antes de poder incorporar Componentes a la interface de usuario que se desea implementar, el programador debe crear un Contenedor. Cuando se construye una aplicación, el programador debe crear en primer lugar una instancia de la clase Window o de la clase Frame. Cuando lo que se construye es un applet, ya existe un Frame (la ventana del navegador). Debido a que la clase Applet está derivada de la clase Panel, el programador puede ir añadiendo Componentes directamente a la instancia que se crea de la clase Applet.

En el siguiente ejemplo se crea un Frame vacío. El título del Frame, que corresponderá al título de la ventana, se fija en la llamada al constructor. Un Frame inicialmente está invisible, para poder verlo es necesario invocar al método show():

        import java.awt.*;

        public class Ejemplo1 {
            public static void main( String args[] ) {
                Frame f = new Frame( "Ejemplo 1" );

                f.show();
                }
            }

En el código de ejemplo que sigue, extendemos el código anterior para que la nueva clase sea una subclase de la clase Panel. En el método main() de esta nueva clase se crea una instancia de ella y se le incorpora un objeto Frame llamando al método add(). El resultado de ambos ejemplos es idéntico a efectos de apariencia en pantalla:

        import java.awt.*;

        public class Ejemplo2 extends Panel {
            public static void main( String args[] ) {
                Frame f = new Frame( "Ejemplo 2" );
                Ejemplo2 ej = new Ejemplo2();

                f.add( "Center",ej );
                f.pack();
                f.show();
                }
            }

Derivando la nueva clase directamente de la clase Applet en vez de Panel, nuestro ejemplo puede ahora ejecutarse tanto como una aplicación solitaria como dentro de una página HTML en un navegador. El código siguiente muestra esta circunstancia:

        import java.awt.*;

        public class Ejemplo3 extends java.applet.Applet {
            public static void main( String args[] ) {
                Frame f = new Frame( "Ejemplo 3" );
                Ejemplo3 ej = new Ejemplo3();

                f.add( "Center",ej );
                f.pack();
                f.show();
                }
            }

Un objeto Window, y en algunos casos incluso un objeto Dialog, pueden reemplazar al objeto Frame. Son Contenedores válidos y los Componentes se añaden en ellos del mismo modo que se haría sobre un Frame.

### Añadir Componentes a un Contenedor

Para que la interface sea útil, no debe estar compuesta solamente por Contenedores, éstos deben tener Componentes en su interior. Los Componentes se añaden al Contenedor invocando al método add() del Contenedor. Este método tiene tres formas de llamada que dependen del manejador de composición o layout manager que se vaya a utilizar sobre el Contenedor.

En el código siguiente, incorporamos dos botones al código del último ejemplo. La creación se realiza en el método init() porque éste siempre es llamado automáticamente al inicializarse el applet. De todos modos, al inciarse la ejecución se crean los botones, ya que el método init() es llamado tanto por el navegador como por el método main():

        import java.awt.*;

        public class Ejemplo4 extends java.applet.Applet {
            public void init() {
                add( new Button( "Uno" ) );
                add( new Button( "Dos" ) );
                }

            public static void main( String args[] ) {
                Frame f = new Frame( "Ejemplo 4" );
                Ejemplo4 ej = new Ejemplo4();

                ej.init();

                f.add( "Center",ej );
                f.pack();
                f.show();
                }
            }

|  | ##### [Anterior] [Indice] [Siguiente]