Vous êtes sur la page 1sur 9

AWT - Contenedores

Anterior | Siguiente La clase Container es una clase abstracta derivada de Component, que representa a cualquier componente que pueda contener otros componentes. Se trata, en esencia, de aadir a la clase Component la funcionalidad de adicin, sustraccin, recuperacin, control y organizacin de otros Componentes. Al igual que la clase Component, no dispone de constructores pblicos y, por lo tanto, no se pueden instanciar objetos de la clase Container. Sin embargo, s se puede extender para implementar la nueva caracterstica incorporada a Java en el JDK 1.1, de los componentes Lightweight. El AWT proporciona varias clases de Contenedores: Panel Applet ScrollPane Window Dialog FileDialog Frame

Aunque los que se pueden considerar como verdaderos Contenedores con Window, Frame, Dialog y Panel, porque los dems son subtipos con algunas caractersticas determinadas y solamente tiles en circunstancias muy concretas.

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. El controlador de posicionamiento de Componentes por defecto, sobre un objeto Window, es el BorderLayout. Una instancia de esta clase no tiene ni ttulo ni borde, as que es un poco difcil de justificar su uso para la construccin directa de un interfaz grfico, porque es mucho ms sencillo utilizar objetos de tipo Frame o Dialog. Dispone de varios mtodos para alterar el tamao y ttulo de la ventana, o los cursores y barrar de mens.

Frame
Es una superficie de pantalla de alto nivel (una ventana) con borde y ttulo. Una instancia de la clase Frame puede tener una barra de men. Una instancia de esta clase es mucho ms aparente y ms semejante a lo que se entiende por ventana. Y, a no ser que el lector haya comenzado su estudio por esta pgina, ya se habr encontrado en varias ocasiones con la clase Frame, que es utilizada en gran parte de los ejemplos de este Tutorial. Su uso se debe en gran parte a la facilidad de su instanciacin y, lo que tampoco deja de ser interesante, su facilidad de conclusin. La clase Frame extiende a la clase Window, y su controlador de posicionamiento de Componentes por defecto es elBorderLayout. Los objetos de tipo Frame son capaces de generar varios tipos de eventos, de los cuales el ms interesante es el evento de tipo WindowClosing, que se utiliza en este Tutorial de forma exhaustiva, y que se produce cuando el usuario pulsa sobre el botn de cerrar colocado en la esquina superior-derecha (normalmente) de la barra de ttulo del objeto Frame.

En el ejemplo java1312.java se ilustra el uso de la clase Frame y algunos de sus mtodos. El programa instancia un objeto Frame con tres botones que realizan la accin que se indica en su ttulo. La imagen reproduce la ventana que genera la aplicacin y su situacin tras haber pulsado el botn que cambia el cursor a forma de mano. Es un ejemplo muy simple, aunque hay que advertir al lector que se hace uso en l de la sintaxis abreviada de las clases anidadas, que se tratarn en otra seccin; para que no se asuste al ver el cdigo del ejemplo. Este mtodo se utiliza para instanciar y registrar receptores de eventos sobre los tres botones, ms el de cerrar la ventana, colocados sobre el objeto Frame. import java.awt.*; import java.awt.event.*; import java.util.*; public class java1312 { public static void main( String args[] ) { IHM ihm = new IHM(); } } class IHM { Frame miFrame; public IHM() { // Se instancian tres botones con textos indicando lo que // hacen cuando se pulse sobre ellos Button botonTitulo = new Button( "Imprime Titulo" ); Button botonCursorMano = new Button( "Cursor Mano" ); Button botonCursorFlecha = new Button( "Cursor Flecha" ); // Instancia un objeto Frame con su titulo indicativo de que se // se trata, utilizando un FlowLayout miFrame = new Frame( "Tutorial de Java, AWT" ); miFrame.setLayout( new FlowLayout() ); // Aade tres objetos Button al Frame miFrame.add( botonTitulo ); miFrame.add( botonCursorMano ); miFrame.add( botonCursorFlecha ); // Fija el tamao del Frame y lo hace visible miFrame.setSize( 250,200 ); miFrame.setVisible( true ); // Instancia y registra objetos ActionListener sobre los // tres botones utilizando la sintaxis abreviada de las // clases anidadas

botonTitulo.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { System.out.println( miFrame.getTitle() ); } } ); botonCursorMano.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt ) { miFrame.setCursor( new Cursor( Cursor.HAND_CURSOR ) ); } } ); botonCursorFlecha.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { miFrame.setCursor( new Cursor( Cursor.DEFAULT_CURSOR ) ); } } ); // Instancia y registra un objeto WindowListener sobre el objeto // Frame para terminar el programa cuando el usuario haga click // con el raton sobre el boton de cerrar la ventana que se // coloca sobre el objeto Frame miFrame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { // Concluye la aplicacion cuando el usuario cierra la // ventana System.exit( 0 ); } } ); }

El siguiente trozo de cdigo es el tpico utilizado en la instanciacin de un objeto Frame, la indicacin del controlador de posicionamiento de Componentes que se va a utilizar y, en este caso, la incorporacin de los tres Componentes de tipo Button al objeto Frame. // Se instancian tres botones con textos indicando lo que // hacen cuando se pulse sobre ellos Button botonTitulo = new Button( "Imprime Titulo" ); Button botonCursorMano = new Button( "Cursor Mano" ); Button botonCursorFlecha = new Button( "Cursor Flecha" ); // Instancia un objeto Frame con su titulo indicativo de que se // se trata, utilizando un FlowLayout miFrame = new Frame( "Tutorial de Java, AWT" ); miFrame.setLayout( new FlowLayout() ); // Aade tres objetos Button al Frame miFrame.add( botonTitulo ); miFrame.add( botonCursorMano ); miFrame.add( botonCursorFlecha ); Y en los dos bloques de sentencias que se reproducen a continuacin, se utilizan clases anidadas para instanciar y registrar objetos de tipo ActionListener. Por ejemplo, sobre el botn que permite recoger el ttulo de la ventana, se hace tal como se indica. botonTitulo.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { System.out.println( miFrame.getTitle() ); }

} ); Y, para instanciar y registrar un objeto WindowListener sobre el objeto Frame, para concluir la aplicacin cuando el usuario cierre la ventana, se emplean las siguientes lneas de cdigo. miFrame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { // Concluye la aplicacin cuando el usuario cierra la // ventana System.exit( 0 ); } } );

Dialog
Es una superficie de pantalla de alto nivel (una ventana) con borde y ttulo, que permite entradas al usuario. La claseDialog extiende la clase Window, que extiende la clase Container, que extiende a la clase Component; y el controlador de posicionamiento por defecto es el BorderLayout. De los constructores proporcionados por esta clase, destaca el que permite que el dilogo sea o no modal. Todos los constructores requieren un parmetro Frame y, algunos de ellos, permiten la especificacin de un parmetro booleano que indica si la ventana que abre el dilogo ser modal o no. Si es modal, todas las entradas del usuario sern recogidas por esta ventana, bloqueando cualquier entrada que se pudiese producir sobre otros objetos presentes en la pantalla. Posteriormente, si no se ha especificado que el dilogo sea modal, se puede hace que adquiera esta caracterstica invocando al mtodo setModal().

El ejemplo java1313.java, cuya imagen en pantalla al arrancar es la que reproduce la imagen que precede a este prrafo, presenta el mnimo cdigo necesario para conseguir que un objeto Dialog aparezca sobre la pantalla. Cuando se arranca el programa, en la pantalla se visualizar un objeto Frame y un objeto Dialog, que debera tener la mitad de tamao del objeto Frame y contener un ttulo y un botn de cierre. Este botn de cierre no es operativo. El objetoDialog no tiene la caja de control de la esquina superior izquierda al uso. El objeto Dialog puede ser movido y redimensionado, aunque no se puede ni minimizar ni maximizar. Se pueden colocar en cualquier lugar de la pantalla, su posicin no est restringida al interior del padre, el objeto Frame. El objeto Dialog difiere significativamente en apariencia del objeto Frame, sobre todo por la presencia del borde en este ltimo, circunstancia que llama mucho la atencin. import java.awt.*; import java.awt.event.*; public class java1313 extends Frame { public static void main( String args[] ) { // Instancia un objeto de este tipo new java1313(); } // Constructor public java1313() {

setTitle( "Tutorial de Java, AWT" ); setSize( 250,150 ); setVisible( true ); Dialog miDialogo = new Dialog( this,"Dialogo" ); miDialogo.setSize( 125,75 ); // Hace que el dialogo aparezca en la pantalla miDialogo.show(); } } La parte ms interesante del ejemplo reside en tres sentencias. La primera, instancia el objeto Dialog como hijo del objeto principal, this . La segunda sentencia establece el tamao inicial del objeto Dialog. La tercera sentencia hace que el objeto Dialog aparezca en la pantalla. Dialog miDialogo = new Dialog( this,"Dialogo" ); miDialogo.setSize( 125,75 ); // Hace que el dialogo aparezca en la pantalla miDialogo.show(); El ejemplo java1314.java, est diseado para producir dos objetos Dialog, uno modal y otro no-modal. Un objetoFrame sirve de padre a los dos objetos Dialog. El Dialog no-modal se crea con un botn que sirve para cerrarlo. Sobre este botn se instancia y registra un objetoActionListener. Este objeto ActionListener es instanciado desde una clase ActionListener compartida. El cdigo del mtodo sobrescrito actionPerformed() de la clase ActionListener, cierra el objeto Dialog, invocando al mtodosetVisible() con el parmetro false , aunque tambin se podra haber utilizado hide() o dispose(). El Dialog modal se crea de la misma forma, conteniendo un botn al que se asigna un cometido semejante. Sobre el objeto Frame se crean dos botones adicionales, uno mostrar el dilogo modal y el otro mostrar el dilogono-modal. Estos dos objetos Button comparten una clase ActionListener que est diseada para mostrar un objetoDialog de un tamao predeterminado y en una posicin parametrizada, controlada a travs del parmetro offset, que se pasa al objeto ActionListener cuando se instancia.

La imagen muestra la ventana que genera la aplicacin cuando se ejecuta por primera vez y se selecciona el Dilogo No-Modal, pulsando el botn correspondiente. Para evitar que se superpongan, los objetos ActionListener de los dos botones que visualizan los objetos Dialog, se instancian con valores de offset diferentes, por lo que aparecern en posiciones

distintas

de la pantalla en el momento de su visualizacin.


Si se compila y ejecuta el programa, aparecern los dos botones en la pantalla, tal como muestra la imagen que aparece en prrafos anteriores. Uno de los botones puede ser utilizado para mostrar el objeto Dialog no-modal y

el otro para visualizar el Dialog modal. Cuando el objeto Dialog modal no est visible, se podr mostrar y cerrar el objeto Dialog no-modal, o pulsar en la caja de cierre del Frame para terminar la ejecucin del programa. Sin embargo, cuando est visible el Dialog modal, no se podr realizar ninguna otra accin dentro del programa; el modo de operacin es el que se conoce como aplicacin modal. Un objeto receptor de eventos windowClosing() es instanciado y registrado sobre el Frame para concluir la ejecucin del programa cuando se cierre el Frame; sin embargo, el Frame no puede cerrarse cuando el objeto Dialog modal est visible. A continuacin se comentan los trozos de cdigo ms interesantes del ejemplo anterior. El primero de ellos es la sentencia que instancia el objeto Frame, que a pesar de ser semejante a muchas de las ya vistas, lo que la hace importante en este programa es el ser padre de los dos objetos Dialog, por lo cual es imprescindible que sea instanciado antes de los dos objetos Dialog. Frame miFrame = new Frame( "Tutorial de Java, AWT" ); El siguiente fragmento interesante es el tpico cdigo que es utilizado para instanciar los objetos Dialog, colocar un objeto Button en el objeto Dialog, e instanciar y registrar un objeto ActionListener sobre el objeto Button. Dialog dialogoNoModal = new Dialog( miFrame,"Dialogo No Modal" ); Button botonCerrarNoModal = new Button( "Cerrar" ); dialogoNoModal.add( botonCerrarNoModal ); botonCerrarNoModal.addActionListener( new closeDialogListener( dialogoNoModal ) ); Este es el fragmento que crea el objeto Dialog modal. El que se usa para crear el objeto Dialog no-modal es esencialmente el mismo excepto que no tiene el parmetro booleando true en la invocacin del constructor. Este cdigo es seguido por el que instancia los objetos Button y registra objetos ActionListener sobre estos botones. Y, a este cdigo le sigue el que finaliza la construccin del objeto Frame, que ya se ha visto en varias ocasiones y no merece la pena insistir en l. El trozo de cdigo ms interesante de todos es el fragmento en que la clase ActionListener es utilizada para instanciar objetos para mostrar un objeto Dialog. Y es muy interesante por dos aspectos. Uno de ellos es el constructor parametrizado que se utiliza para guardar el offset que se le pasa como parmetro al objetoActionListener, cuando se instancia. Este valor de offset es combinado con valores en el cdigo para controlar el tamao y la posicin del objeto Dialog cuando aparece en la pantalla. El otro aspecto interesante es que el mtodoshow() de la clase Dialog es utilizado para hacer aparecer el objeto Dialog en la pantalla. class showDialogListener implements ActionListener { Dialog oDialog; int oOffset; showDialogListener( Dialog dialogo,int offset ) { oDialog = dialogo; oOffset = offset; } public void actionPerformed( ActionEvent evt ) { // Seguir este orden es critico para un dialogo modal oDialog.setBounds( oOffset,oOffset,150,100 ); oDialog.show(); } } El orden de ejecucin de las sentencias dentro del mtodo actionPerformed() es crtico. Si el mtodo show() se ejecuta antes del mtodo setBounds() sobre el objeto Dialog modal, el mtodo setBounds() utilizado para controlar el tamao y posicin del objeto Dialog, no tendra efecto alguno. Tamao y posicin del dilogo deben

establecerse antes de hacerlo visible. El ltimo fragmento de cdigo interesante es el mtodo sobrescrito actionPerformed() utilizado para cerrar los objetosDialog. En este ejemplo se usa la llamada al mtodo setVisible() con el parmetro false, aunque tambin se podra haber utilizado el mtodo hide() o el mtodo dispose(), con el mismo cometido. public void actionPerformed( ActionEvent evt ) { oDialog.setVisible( false ); }

Panel
La clase Panel es un Contenedor genrico de Componentes. Una instancia de la clase Panel, simplemente proporciona un Contenedor al que ir aadiendo Componentes. El controlador de posicionamiento de Componentes sobre un objeto Panel, por defecto es el FlowLayout; aunque se puede especificar uno diferente en el constructor a la hora de instanciar el objeto Panel, o aceptar el controlador de posicionamiento inicialmente, y despus cambiarlo invocando al mtodo setLayout(). Panel dispone de un mtodo addNotify(), que se utiliza para crear un observador general (peerPerr) del Panel. Normalmente, un Panel no tiene manifestacin visual alguna por s mismo, aunque puede hacerse notar fijando su color de fondo por defecto a uno diferente del que utiliza normalmente.

El ejemplo java1315.java, ilustra la utilizacin de objetos Panel para configurar un objeto de tipo interfaz grfica, o interfaz hombre-mquina, incorporando tres objetos Panel a un objeto Frame. El controlador de posicionamiento de los Componentes para el objeto Frame se especifica concretamente para que sea un FlowLayout, y se alteran los colores de fondo de los objetos Panel para que sean claramente visibles sobre el Frame. Sobre cada uno de los paneles se coloca un objeto, utilizando el mtodo add(), de tal modo que se aade un objeto de tipo campo de texto sobre el Panel de fondo amarillo, un objeto de tipo etiqueta sobre el Panel de fondo rojo y un objeto de tipo botn sobre el Panel de fondo azul. Ninguno de los Componentes es activo, ya que no se instancian ni registran objetos receptores de eventos sobre ellos. As, por ejemplo, el nico efecto que se puede observar al pulsar el botn del panel azul, se limita al efecto visual de la pulsacin. Sin embargo, s se instancia y registra un receptor de eventos sobre el Frame, para recoger la intencin del usuario de cerrar la ventana y terminar la ejecucin de la aplicacin. import java.awt.*; import java.awt.event.*; public class java1315 { public static void main( String args[] ) { IHM ihm = new IHM(); } }

class IHM { public IHM() { // Se construyen tres Paneles con fondos de color diferente // y sin contener ningun elemento activo Panel panelIzqdo = new Panel(); panelIzqdo.setBackground( Color.yellow ); panelIzqdo.add( new TextField( "Panel Izquierdo -> amarillo" ) ); Panel panelCentral = new Panel(); panelCentral.setBackground( Color.red ); panelCentral.add( new Label( "Panel Central -> rojo" ) ); Panel panelDrcho = new Panel(); panelDrcho.setBackground( Color.blue ); panelDrcho.add( new Button( "Panel Derecho -> azul" ) ); // Se instancia un objeto Frame utilizando un FlowLayout y // se colocan los tres objetos Panel sobre el Frame Frame miFrame = new Frame( "Tutorial de Java, AWT" ); miFrame.setLayout( new FlowLayout() ); miFrame.add( panelIzqdo ); miFrame.add( panelCentral ); miFrame.add( panelDrcho ); miFrame.setSize( 500,200 ); miFrame.setVisible( true ); miFrame.addWindowListener( new Conclusion() ); }

class Conclusion extends WindowAdapter { public void windowClosing( WindowEvent evt ) { // Concluye la aplicacion cuando el usuario cierra la ventana System.exit( 0 ); } } Las sentencias de cdigo ms interesantes del ejemplo se limitan a la tpica instanciacin de los tres objetos Panel, al control del color de fondo y a la incorporacin de otro Componente al Panel, tal como se reproduce en las siguientes sentencias. Panel panelIzqdo = new Panel(); panelIzqdo.setBackground( Color.yellow ); panelIzqdo.add( new TextField( "Panel Izquierdo -> amarillo" ) ); Las siguientes lneas de cdigo instancian un objeto Frame y le aaden los tres objetos Panel construidos anteriormente. Frame miFrame = new Frame( "Tutorial de Java, AWT" ); miFrame.setLayout( new FlowLayout() ); miFrame.add( panelIzqdo ); miFrame.add( panelCentral ); miFrame.add( panelDrcho ); Con este trozo de cdigo se genera el objeto de ms alto nivel de la aplicacin para el interfaz de usuario.

Aadir Componentes a un Contenedor


Para que un interfaz sea til, no debe estr compuesto solamente por Contenedores, stos deben tener Componentes en su interior. Los Componentes se aaden al Contenedor invocando al mtodo add() del Contenedor. Este mtodo tiene tres formas de llamada que dependen del manejador de composicin o layout manager que se vaya a utilizar sobre el Contenedor. En el cdigo siguiente, java1316.java, se incorporan dos botones al Contenedor de tipo Frame. La creacin se realiza en el mtodo init() porque ste siempre es llamado automticamente al inicializarse el applet. De todos modos, al inciarse la ejecucin se crean los botones, ya que el mtodo init() es llamado tanto por el navegador como por el mtodo main(). import java.awt.*; public class java1316 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( "Tutorial de Java" ); java1316 ejemplo = new java1316(); ejemplo.init(); f.add( "Center",ejemplo ); f.pack(); f.show(); } } El ejemplo tambin muestra la forma de cmo el cdigo puede ejecutarse tanto como aplicacin, utilizando el intrprete de Java, como desde un navegador, funcionando como cualquiera de los applets que se han visto en ejemplos anteriores. En ambos casos el resultado, en lo que al ejemplo se refiere, es el mismo: aparecern dos botones en el campo delimitado por el Contenedor Frame. Los Componentes aadidos a un objeto Container entran en una lista cuyo orden define el orden en que se van a presentar los Componentes sobre el Contenedor, de atrs hacia delante. Si no se especifica ningn ndice de orden en el momento de incorporar un Componente al Contenedor, ese Componente se aadir al final de la lista. Hay que tener esto muy en cuenta, sobre todo a la hora de construir interfaces de usuario complejas, en las que pueda haber Componentes que solapen a otros Componentes o a parte de ellos.

Vous aimerez peut-être aussi