Debe introducir al menos 3 caracteres en el buscador.
Inicio / Wikis / Tutoriales / Tutorial de Java - Container

Tutorial de Java - Container

 ***** (115 opiniones)
Creative Commons Tutorial de Agustín Froufe - 29 de Agosto de 2005
Temas Relacionados: Java
78. Container

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:

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();
             }
         }

PANELES

La clase Panel es el más simple de los Contenedores de Componentes gráficos. En realidad, se trataba de crear una clase no-abstracta (Container sí lo es) que sirviera de base a los applet y a otras pequeñas aplicaciones. La clase Panel consta de dos métodos propios: el constructor, cuyo fin es crear un nuevo Panel con un LayoutManager de tipo FlowLayout (el de defecto), y el método addNotify() que, sobrecargando la función del mismo nombre en la clase Container, llama al método createPanel() del Toolkit adecuado, creando así un PanelPeer. El AWT enviará así al Panel (y por tanto al applet) todos los eventos que sobre él ocurran. Esto que puede parecer un poco rebuscado, obedece al esquema arquitectónico del AWT; se trata del bien conocido esquema de separación interface/implementación que establece por un lado una clase de interface y por otro distintas clases de implementación para cada una de las plataformas elegidas.

El uso de Paneles permite que las aplicaciones puedan utilizar múltiples layouts, es decir, que la disposición de los componentes sobre la ventana de visualización pueda modificarse con mucha flexibilidad. Permite que cada Contenedor pueda tener su propio esquema de fuentes de caracteres, color de fondo, zona de diálogo, etc.

Podemos, por ejemplo, crear una barra de herramientas para la zona superior de la ventana de la aplicación o incorporarle una zona de estado en la zona inferior de la ventana para mostrar información útil al usuario. Para ello vamos a implementar dos Paneles:

class BarraHerram extends Panel {
     public BarraHerram() {
         setLayout( new FlowLayout() );
         add( new Button( "Abrir" ) );
         add( new Button( "Guardar" ) );
         add( new Button( "Cerrar" ) );
 
         Choice c = new Choice();
         c.addItem( "Times Roman" );
         c.addItem( "Helvetica" );
         c.addItem( "System" ); 
         add( c );
         add( new Button( "Ayuda" ) );
         }
     }
 
 class BarraEstado extends Panel {
     Label texto;
     Label mas_texto;
 
     public BarraEstado() {
         setLayout( new FlowLayout() );
         add( texto = new Label( "Creada la barra de estado" ) );
         add( mas_texto = new Label( "Información adicional" ) );
         }
 
     public void verEstado( String informacion ) {
         texto.setText( informacion );
         }
     }
 

Ahora, para dar funcionalidad, debemos crear los objetos correspondientes a la barra de herramientas y a la barra de estado con new; al contrario que en C++, en Java todos los objetos deben ser creados con el operador new:

    add( "North",tb = new ToolBar() );
     add( "South",sb = new StatusBar() );
 

También vamos a incorporar un nuevo evento a nuestro controlador, para que maneje los eventos de tipo ACTION_EVENT que le llegarán cuando se pulsen los botones de la barra de herramientas o se realice alguna selección, etc.

    case Event.ACTION_EVENT:
         {
         be.verEstado( evt.arg.toString() );
         return true;
         }
 

Cuando la aplicación reciba este tipo de evento, alterará el contenido de la barra de estado para mostrar la información de la selección realizada o el botón pulsado.

Panel AWT

Al final, la apariencia de la aplicación en pantalla es la que presenta la figura anterior.

 

DIALOGOS Y VENTANAS

Una Ventana genérica, Window, puede utilizarse simplemente para que sea la clase padre de otras clases y se puede intercambiar por un Diálogo, Dialog, sin pérdida de funcionalidad. No se puede decir lo mismo de un Frame.

Se podría crear un menú pop-up con una Ventana, pero lo cierto es que en esta versión del JDK hay un montón de bugs y no merece la pena el enfrascarse en el intento. No obstante, hay ciertos métodos que están en la clase Window y que no están presentes en otras clases que pueden resultar interesantes y necesitar una Ventana si queremos emplearlos. Son:

  • getToolkit()
  • getWarningString()
  • pack()
  • toBack()
  • toFront()

Un Diálogo es una subclase de Window, que puede tener un borde y ser modal, es decir, no permite hacer nada al usuario hasta que responda al diálogo. Esto es lo que se usa en las cajas de diálogo "Acerca de...", en la selección en listas, cuando se pide una entrada numérica, etc.

El código Java que se expone a continuación, implementa el diálogo Acerca de para la aplicación. Esta clase se crea oculta y necesitaremos llamar al método show() de la propia clase para hacerla visible.

    class AboutDialog extends Dialog {
         static int HOR_TAMANO = 300;
         static int VER_TAMANO = 150;
 
         public AboutDialog( Frame parent ) {
             super( parent,"Acerca de...",true );
             this.setResizable( false );
             setBackground( Color.gray );
             setLayout( new BorderLayout() );
 
             Panel p = new Panel();
             p.add( new Button( "Aceptar" ) );
             add( "South",p );
             resize( HOR_TAMANO,VER_TAMANO );
             }
 
         public void paint( Graphics g ) {
             g.setColor( Color.white );
             g.drawString( "Aplicación Java con AWT",
                 HOR_TAMANO/4,VER_TAMANO/3 );
             g.drawString( "Versión 1.00",
                 HOR_TAMANO/3+15,VER_TAMANO/3+20 );
             }
 
         public boolean handleEvent( Event evt ) {
             switch( evt.id ) {
                 case Event.ACTION_EVENT:
                     {
                     if( "Aceptar".equals( evt.arg ) ) 
                         {
                         hide();
                         return true;
                         }
                     }
                 default: 
                     return false;
                 }
             }
         }
 

La ventana que aparece en pantalla generada por la clase anterior es la que muestra la figura:

Acerca de...

Las aplicaciones independientes deberían heredar tomando como padre la ventana principal de esa aplicación. Así pueden implementar la interface MenuContainer y proporcionar menús.

No hay razón aparente para que sea una subclase de la clase Frame, pero si se quiere proporcionar funcionalidad extra, sí debería serlo, en vez de serlo de su padre: Window. Esto es así porque Frame implementa la interface MenuContainer, con lo cual tiene la posibilidad de proporcionar menús y cambiar el cursor, el icono de la aplicación, etc.

Un ejemplo más complicado de aplicación gráfica basada en el AWT es el convertidor de decimal a binario/octal/hexadecimal/base36, Convertidor.java, cuya presentación en pantalla es la que muestra la figura siguiente.

Convertidor decimal

En la construcción de esta nueva aplicación se utilizan elementos que se presentan en profundidad en secciones posteriores de este Tutorial.

CREAR EL MARCO DE LA APLICACION

El Contenedor de los Componentes es el Frame. También es la ventana principal de la aplicación, lo que hace que para cambiar el icono o el cursor de la aplicación no sea necesario crear métodos nativos; al ser la ventana un Frame, ya contiene el entorno básico para la funcionalidad de la ventana principal.

Vamos a empezar a crear una aplicación básica, a la que iremos incorporando Componentes. Quizás vayamos un poco de prisa en las explicaciones que siguen; no preocuparse, ya que lo que no quede claro ahora, lo estará más tarde. El problema es que para poder profundizar sobre algunos aspectos de Java, necesitamos conocer otros previos, así que proporcionaremos un ligero conocimiento sobre algunas características de Java y del AWT, para que nos permitan entrar a fondo en otras; y ya conociendo estas últimas, volveremos sobre las primeras. Un poco lioso, pero imprescindible.

En el archivo AplicacionAWT.java, se encuentra el código completo de la aplicación que vamos ir construyendo a lo largo de este repaso general por las características de que dispone el AWT.

Comenzaremos el desarrollo de nuestra aplicación básica con AWT a partir del código que mostramos a continuación:

import java.awt.*;
 
 public class AplicacionAWT extends Frame {
     static final int HOR_TAMANO = 300;
     static final int VER_TAMANO = 200;
 
     public AplicacionAWT() {
         super( "Aplicación Java con AWT" );
 
         pack();
         resize( HOR_TAMANO,VER_TAMANO );
         show();
         }
 
     public static void main( String args[] ) {
         new AplicacionAWT();
         }
     }
 

La clase anterior es un Frame, ya que extiende esa clase y hereda todas sus características. Tiene un método, el constructor, que no admite parámetros.

Además, se hace una llamada explícita al constructor super, es decir, al constructor de la clase padre, para pasarle como parámetro la cadena que figurará como el título de la ventana.

La llamada a show() es necesaria, ya que por defecto, los Contenedores del AWT se crean ocultos y hay que mostrarlos explícitamente. La llamada a pack() hace que los Componentes se ajusten a sus tamaños correctos en función del Contenedor en que se encuentren situados.

La ejecución de la aplicación mostrará la siguiente ventana en pantalla:

Marco de la aplicacion

Los atributos fundamentales de la ventana anterior son:

  • Marco de 300x200 pixels
  • No tiene barra de menú
  • No tiene ningún Componente
  • Título "Aplicación Java con AWT"
  • Color de fondo por defecto
  • Layout por defecto
  • Fondo de la ventana vacío
Tabla de contenidos
  1. 1 - DECLARACIÓN DE INTENCIONES
  2. 2 - PRESENTACIÓN
  3. 3 - INTRODUCCIÓN A JAVA
  4. 4 - Origen de JAVA
  5. 5 - Características de JAVA
  6. 6 - HotJava
  7. 7 - JAVA para aplicaciones corporativas
  8. 8 - INSTALACIÓN DEL JDK
  9. 9 - Windows
  10. 10 - Solaris
  11. 11 - Linux
  12. 12 - Compilación sin JDK
  13. 13 - CONCEPTOS BÁSICOS DE JAVA
  14. 14 - Programación en JAVA
  15. 15 - Control del Flujo
  16. 16 - Clases
  17. 17 - Variables y Métodos de Instancia
  18. 18 - Alcance de Objetos y Reciclado de Memoria
  19. 19 - Herencia
  20. 20 - Control de Acceso
  21. 21 - Variables y Métodos Estaticos
  22. 22 - this y super
  23. 23 - Clases Abstractas
  24. 24 - Interfaces
  25. 25 - Métodos Nativos
  26. 26 - Paquetes
  27. 27 - Referencias
  28. 28 - Punteros y Referencias C
  29. 29 - Referencias en Java
  30. 30 - Referencias y Arrays
  31. 31 - Referencias y Listas
  32. 32 - Punteros C/C++ y Referencias Java
  33. 33 - PROGRAMAS BÁSICOS EN JAVA
  34. 34 - Una mínima aplicación en Java
  35. 35 - Compilación y Ejecución de HolaMundo
  36. 36 - El visor de Applets de Sun (appletviewer)
  37. 37 - Arquitectura de appletviewer
  38. 38 - Métodos de appletviewer
  39. 39 - Funciones de menú de appletviewer
  40. 40 - Un Applet basico en Java
  41. 41 - Compilación de un Applet
  42. 42 - La marca APPLET de html
  43. 43 - Atributos de APPLET
  44. 44 - Paso de parametros a Applets
  45. 45 - Tokens en parametros de llamada
  46. 46 - El parametro ARCHIVE
  47. 47 - Depuración general
  48. 48 - Ciclo de vida de un Applet
  49. 49 - Protección de Applets
  50. 50 - Escribir Applets Java
  51. 51 - La aplicación Fecha (Aproximación a OOP)
  52. 52 - EL DEPURADOR DE JAVA - JDB
  53. 53 - CLASES JAVA
  54. 54 - La clase Math
  55. 55 - La clase Character
  56. 56 - La clase Float
  57. 57 - La clase Double
  58. 58 - La clase Integer
  59. 59 - La clase Long
  60. 60 - La clase Boolean
  61. 61 - La clase String
  62. 62 - La clase StringBuffer
  63. 63 - Uso de Conversiones
  64. 64 - ABSTRACT WINDOW TOOLKIT (AWT)
  65. 65 - Interface de Usuario
  66. 66 - Estructura del AWT
  67. 67 - Componentes y Contenedores
  68. 68 - Tipos de Componentes
  69. 69 - BorderLayout
  70. 70 - CardLayout
  71. 71 - CheckboxGroup
  72. 72 - Color
  73. 73 - Component
  74. 74 - Button - Botones
  75. 75 - Canvas
  76. 76 - Checkbox
  77. 77 - Choice
  78. 78 - Container
  79. 79 - Label - Etiquetas
  80. 80 - List - Listas
  81. 81 - Scrollbar - Barras de desplazamiento
  82. 82 - TextComponent
  83. 83 - Fijar el tamaño preferido
  84. 84 - La clase Event
  85. 85 - FlowLayout
  86. 86 - Cambio de fuente de caracteres
  87. 87 - GridLayout
  88. 88 - GridBagLayout
  89. 89 - Uso de Insets
  90. 90 - MenuComponent
  91. 91 - LayoutManager
  92. 92 - Diseño de Componentes propios
  93. 93 - Creación de Aplicaciones con AWT
  94. 94 - Crear el Marco de la aplicación (Frame)
  95. 95 - Inicializar Fuentes, Colores, Layouts y demas recursos
  96. 96 - Crear menús y Barras de Menús
  97. 97 - Crear los controles, dialogos, ventanas, etc.
  98. 98 - Layouts
  1. 99 - FlowLayout
  2. 100 - BorderLayout
  3. 101 - GridLayout
  4. 102 - GridBagLayout
  5. 103 - CardLayout
  6. 104 - Crear un Layout propio
  7. 105 - Control de Eventos
  8. 106 - La clase Event
  9. 107 - Tipos de Eventos
  10. 108 - Generación y Propagación de Eventos
  11. 109 - Métodos de Control de Eventos
  12. 110 - Action_Event
  13. 111 - Mejorar el Diseño de Interfaces
  14. 112 - Cambio de Font de Caracteres
  15. 113 - Colores de Fondo y Texto
  16. 114 - Fijar el Tamaño Preferido
  17. 115 - Uso de Insets
  18. 116 - Habilitar y Deshabilitar Componentes
  19. 117 - Botón Grafico
  20. 118 - GRÁFICOS
  21. 119 - Métodos para Dibujos
  22. 120 - Líneas
  23. 121 - Rectangulos
  24. 122 - Círculos, Elipses
  25. 123 - EXCEPCIONES EN JAVA
  26. 124 - Funciones Graficas
  27. 125 - Manejo de Excepciones
  28. 126 - Fractales
  29. 127 - Generar Excepciones en Java
  30. 128 - Líneas Flotantes
  31. 129 - Excepciones Predefinidas
  32. 130 - Métodos para Imagenes
  33. 131 - Crear Excepciones Propias
  34. 132 - Doble Buffering de Graficos
  35. 133 - Capturar Excepciones
  36. 134 - Nuevas Clases para Dibujo
  37. 135 - Propagación de Excepciones
  38. 136 - La Clase MediaTracker
  39. 137 - THREADS Y MULTITHREADING
  40. 138 - Sonido en Java
  41. 139 - Flujo en Programas
  42. 140 - Entrada por Ratón
  43. 141 - Creación y Control de Threads
  44. 142 - Arrancar y Parar Threads
  45. 143 - Suspender y Reanudar Threads
  46. 144 - Estados de un Thread
  47. 145 - Scheduling
  48. 146 - Prioridades, demonios...
  49. 147 - Ejemplo de Animación
  50. 148 - Comunicación entre Threads
  51. 149 - MÉTODOS NATIVOS
  52. 150 - Escribir Código Java
  53. 151 - Compilar el Código Java
  54. 152 - Crear el fichero de Cabecera
  55. 153 - Crear el fichero de Stubs
  56. 154 - Escribir la función C
  57. 155 - Crear la Librería Dinamica
  58. 156 - Ejecutar el Programa
  59. 157 - ENTRADA / SALIDA ESTÁNDAR
  60. 158 - La clase System
  61. 159 - Clases comunes de Entrada/Salida
  62. 160 - FICHEROS EN JAVA
  63. 161 - Ficheros
  64. 162 - Streams de Entrada
  65. 163 - Streams de Salida
  66. 164 - Ficheros de Acceso Aleatorio
  67. 165 - COMUNICACIONES EN JAVA
  68. 166 - Comunicaciones en Unix
  69. 167 - Sockets
  70. 168 - Diferencias entre Sockets Stream y Datagrama
  71. 169 - Uso de Sockets
  72. 170 - Dominios de Comunicaciones
  73. 171 - Modelo de Comunicaciones con Java
  74. 172 - Apertura de Sockets
  75. 173 - Creación de Streams
  76. 174 - Cierre de Sockets
  77. 175 - Mínimo Cliente SMTP
  78. 176 - Servidor de Eco
  79. 177 - Cliente/Servidor TCP/IP
  80. 178 - Servidor Simple de HTTP
  81. 179 - Red en Windows '95 (sin conexión)
  82. 180 - Clases Útiles en Comunicaciones
  83. 181 - ARQUITECTURA MVC EN JAVA
  84. 182 - La Arquitectura MVC
  85. 183 - Observador y Observable
  86. 184 - Cómo utilizar Observer y Observable
  87. 185 - Ejemplo de aplicación MVC
  88. 186 - APLICACIONES EN JAVA
  89. 187 - Etiqueta
  90. 188 - Reloj Digital
  91. 189 - Persiana
  92. 190 - Solapas
  93. 191 - Transparencia
  94. 192 - Calculadora
  95. 193 - Cuenta-Kilómetros
  96. 194 - Cartel
  97. 195 - FINAL Y AGRADECIMIENTOS
  98. 196 - JAVA Y MATLAB
Autor y licencia de 'Tutorial de Java - Container'
Agustín Froufe Extraído de: http://www.publispain.com/supertutoriales/

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.

Wikis relacionados con 'Tutorial de Java - Container'

Este tutorial presenta los conceptos básicos de líneas de transmisión (Transmission lines), así como una... Más »
La idea es dar una guía ordenada para el estudio de este lenguaje, muy poderoso... Más »
PHP se ha convertido en el lenguaje de facto de Internet y no es difícil... Más »
Si tuviera que buscar un adjetivo para calificar a Sendmail, pensaría en "excesivo". Excesivo puesto... Más »
La red telefónica básica se creó para permitir las comunicaciones de voz a distancia. Esto... Más »
Gente Wiki
Rened
Soy profesional de la educación, me desempeño como profesor de diseño grafico, actualmente me encuentro realizando estudios de doctorado en...
Daniel I. Krichman
Trabajo en diseño, comunicación y mediación de tics en educación desde hace quince años. Esto incluye diseño y desarrollo de...
Froilàn Sudario Remigio
Soy profesor de lengua y literatura, ciencia religiosas egresado de la u. Champagnat. Participo en grupo parroquìal en sjm. Tengo...
Historia, Historia de la literatura,...
Mario Veloz
Soy ingeniero electromecánico, soy jefe de producción y mi interes es buscar nuevos conocimientos en mi línea e implementralos en...
Gestión de repuestos, Mecánica,...
Carlos Alberto Suárez Arcos
Hola , soy profesor de filosofía. En el centro universitario de las tunas cuba, me interesan los temas relacionados con...
Pensamiento y política
Vivi Perez
Soy fisioterapeuta y profesora universitaria, me gusta la ciencia, compartir criterios y aprender cada días más sobre cosas que ustedes...
Ortopedia
Suscribirse
¿Estás seguro de que deseas eliminar este capítulo?