You are on page 1of 18

AWT - Layouts (III

)
GridLayout
La composición GridLayout proporciona gran flexibilidad para situar Componentes. El controlador de posicionamiento se crea con un determinado número de filas y columnas y los Componentes van dentro de las celdas de la tabla así definida. Si el Contenedor es alterado en su tamaño en tiempo de ejecución, el sistema intentará mantener el mismo número de filas y columnas dentro de los márgenes de separación que se hayan indicado. En este caso, estos márgenes tienen prioridad sobre el tamaño mínimo que se haya indicado para los Componentes, por lo que puede llegar a conseguirse que sean de un tamaño tan pequeño que sus etiquetas sean ilegibles. En el ejemplo java1325.java, se muestra el uso de este controlador de posicionamiento de Componentes. Además, el programa tiene un cierto incremento de complejidad respecto a los que se han visto hasta ahora para mostrar layouts, porque en este caso se crea un objeto para el interfaz de usuario que está compuesto a su vez de más objetos de nivel inferior. Y también, se ilustra el proceso de modificar dinámicamente, en tiempo de ejecución, un layout. El interfaz de usuario está constituido por un objeto Frame sobre el que se colocan objetos Panel utilizando el controlador de posicionamiento por defecto para el Frame, BorderLayout. Uno de los objetos Panel contiene seis objetos Button posicionados utilizando un GridLayout, y no tienen ninguna funcionalidad asignada, no se registra sobre ellos ningún receptor de eventos. Inicialmente, los botones se colocan en una tabla de dos filas y tres columnas. El otro objeto Panel contiene dos botones con los rótulos 3x2 y 2x3, que se colocan utilizando un FlowLayout. Además, estos botones sí son funcionales, ya que se registran sobre ellos objetos ActionListener. Cuando se pulsa sobre el botón 3x2, los botones del otro Panel se reposicionan en tres filas y dos columnas. Y, de forma semejante, cuando se pulsa sobre el botón 2x3, los objetos Button del otro panel se recolocan en dos filas y tres columnas. Se instancia y registra, también, un receptor de eventos de cierre de ventana sobre el objeto Frame, para terminar el programa cuando se pulse sobre el botón de cierre del Frame.
import java.awt.*; import java.awt.event.*; public class java1325 { public static void main( String args[] ) { IHM ihm = new IHM(); } } class IHM { public IHM() { // Se instancian los dos botones que van a proporcionar la // funcionalidad a la aplicacion Button boton7 = new Button( "3x2" );

miFrame. boton8. Un objeto de cada una // de ellas se instancia y registra sobore cada uno de los dos . i++) panel1. AWT" ).setLayout( miGridLayout ).addWindowListener( new Conclusion() ). // A estos botones se les añadira su funcionalidad a traves de // objetos receptores de los eventos ActionListener registrados // sobre ellos Panel panel2 = new Panel().add( boton8 ). panel2. // IMPORTANTE: Se añaden los dos objetos Panel que se han // preparado al objeto Frame para crear el interfaz definitivo miFrame.Button boton8 = new Button( "2x3" ). // Se termina de dar funcionalidad al interfaz.add( panel2. // Se instancia un objeto layout de tipo GridLayout para ser // utilizado con el Panel GridLayout miGridLayout = new GridLayout( 2. miFrame.miFrame ) ). // Fijamos el layout que habiamos definido para el panel panel1. // Se colocan los seis botones sobre el panel con una // etiqueta indicando su numero for( int i=0."North" ). // Se instancia el segundo objeto Panel utilizando el FlowLayout // por defecto y se colocan los dos botones funcionales sobre el.addActionListener( new A2x3ActionListener( miGridLayout. i < 6.add( panel1. que sera el padre de todo // el interfaz de usuario que se esta creando Frame miFrame = new Frame( "Tutorial de Java.addActionListener( new A3x2ActionListener( miGridLayout.setSize( 250.miFrame ) ).3 )."South" ). panel2. // Se instancia el objeto Frame.add( boton7 ).add( new Button( "Boton"+i ) ). miFrame.setVisible( true ). // los receptores de eventos de tipo Action. // Se instancian los objetos Receptores de eventos Action y se // registran con los botones 7 y 8. instanciando y // registrando un objeto receptor de eventos de la ventana para // concluir la ejecucion de la aplicacion cuando el usuario cierre // el Frame miFrame.150 ). } } // Las siguientes dos clases son las clases de los ActionListener. // Instancia el primero de los dos objetos Panel que sera // integrado en el objeto Frame Panel panel1 = new Panel(). que corresponden al // segundo Panel y que van a modificar el posicionamiento de // los otrs seis botones en el Panel contiguo boton7.

miObjGridLayout.Frame frame ) { miObjGridLayout = layout. } // Cuando se produce un evento Action. miObjFrame. A3x2ActionListener( GridLayout layout.Frame frame ) { miObjGridLayout = layout. } } .validate().setRows( 2 ). miObjFrame. A2x3ActionListener( GridLayout layout. de forma que los botones que estan colocados sobre // el se cambien de posicion class A3x2ActionListener implements ActionListener { GridLayout miObjGridLayout. miObjFrame = frame. } } class Conclusion extends WindowAdapter { public void windowClosing( WindowEvent evt ) { // Termina la ejecucion del programa cuando se cierra la // ventana principal de la aplicacion System. y posteriormente se valida el Frame // para asegurarse de que el alyout es valido y tendra efecto // sobre la visualizacion en pantalla public void actionPerformed( ActionEvent evt ) { miObjGridLayout. El proposito de estos // controladores de eventos es modificar el layout del panel // contiguo. Frame miObjFrame.setColumns( 3 ).setColumns( 2 ). miObjFrame. miObjGridLayout. Luego se fija el // controlador de posicionamiento para que sea el nuevo que // acabamos de modificar. Luego se fija el // controlador de posicionamiento para que sea el nuevo que // acabamos de modificar.setLayout( miObjGridLayout ). miObjFrame = frame. y posteriormente se valida el Frame // para asegurarse de que el alyout es valido y tendra efecto // sobre la visualizacion en pantalla public void actionPerformed( ActionEvent evt ) { miObjGridLayout. } // Cuando se produce un evento Action. se fijan las filas a 3 y // la columnas a 2 sobre el objeto GridLayout. Frame miObjFrame.validate(). se fijan las filas a 2 y // la columnas a 3 sobre el objeto GridLayout. miObjFrame.// botones funcionales de la aplicacion. } } class A2x3ActionListener implements ActionListener { GridLayout miObjGridLayout.setLayout( miObjGridLayout ).setRows( 3 ).exit( 0 ).

Estos objetos no pueden ser instanciados anónimamente. panel2. Esto se hace en las siguientes sentencias: Panel panel2 = new Panel(). . inicialmente aparecerá en pantalla una ventana semejante a la que se reproduce en la imagen siguiente: A continuación se comentan algunas de las sentencias de código más interesantes del programa. y es necesario que pueda tener una variable de referencia sobre cada objeto para permitir ese registro. // Se colocan los seis botones sobre el panel con una // etiqueta indicando su numero for( int i=0. precisamente porque sobre ellos se va a registrar un objeto de tipo ActionListener. Y. instanciado antes.add( new Button( "Boton"+i ) ). Para comenzar. como controlador de posicionamiento en el panel.setLayout( miGridLayout ).3 ). i < 6. que son los que van a tener funcionalidad. // Fijamos el layout que habiamos definido para el panel panel1. En el siguiente trozo de código se instancia uno de los objetos Panel que se integrarán en el objeto Frame principal. En este caso. Ahora se instancia el segundo objeto Panel. y se colocan en él los dos botones que se habían instanciado antes. Panel panel1 = new Panel(). se usa un bucle para colocar los seis objetos Button en el Panel. i++) panel1.add( boton7 ). Tampoco este objeto puede ser anónimo. ya que no se va a registrar sobre ellos ningún tipo de receptor de eventos. Se usará el objeto GridLayout. Button boton7 = new Button( "3x2" ). Button boton8 = new Button( "2x3" ). se instancian dos objetos Button que posteriormente serán los botones funcionales del programa. porque se necesitará acceso a él a la hora de modificar la colocación de los Componentes sobre ese Panel.Si se compila y ejecuta la aplicación. sí es posible hacer que los objetos Button sean anónimos. GridLayout miGridLayout = new GridLayout( 2. La siguiente sentencia instancia un objeto GridLayout que será utilizado como controlador de posicionamiento para uno de los objetos Panel. a continuación.

setLayout( miObjGridLayout ). es un tanto prehistórico en su forma de hacer las cosas. El próximo paso es instanciar un objeto Frame que servirá como interfaz. En este instante.addActionListener( new A3x2ActionListener( miGridLayout. } GRIDBAGLAYOUT Es igual que la composición de GridLayout. para procesar los eventos de los dos objetos Button que van a permitir cambiar la apariencia de los botones. public void actionPerformed( ActionEvent evt ) { miObjGridLayout. así que el siguiente paso es instanciar y registrar un objeto anónimo receptor de eventos de tipo Action. boton8.miFrame ) ). En este caso. a la recepción de un evento. Frame miFrame = new Frame( "Tutorial de Java. miObjFrame. .add( panel1. Parece que la filosofía de la gente de JavaSoft es que todo debe hacerse en el código. si quiere prescindir de herramientas de diseño.setColumns( 2 ).add( panel2. el trabajo del programador. AWT" ). con la diferencia que los Componentes no necesitan tener el mismo tamaño. hay que tomar el rol de un auténtico aventurero.add( boton8 ).validate(). La verdad es que hasta que no haya en Java algo semejante a los recursos de X.panel2."South" ). Es quizá el controlador de posicionamiento más sofisticado de los que actualmente soporta AWT. Una vez que se instancie. miObjGridLayout.addActionListener( new A2x3ActionListener( miGridLayout. miFrame. un evento provocado por uno de los objetos Button hace que los Componentes se coloquen en una malla de 3 filas por 2 columnas. tal como se puede ver en las sentencias que se reproducen a continuación. El código del controlador de eventos. El código del otro controlador es semejante. se colocarán en él los dos objetos Panel utilizando su controlador de posicionamiento por defecto. miObjFrame. el BorderLayout. la creación física del interfaz está concluida. boton7. // IMPORTANTE: Se añaden los dos objetos Panel que se han // preparado al objeto Frame para crear el interfaz definitivo miFrame.miFrame ) ). y un evento sobre el otro objeto Button hace que se recoloquen en dos filas y tres columnas. A la hora de ponerse a trabajar con este controlador de posicionamiento.setRows( 3 )."North" ). hace uso de los métodos de la clase del Layout para ejecutar las acciones pertinentes.

setConstraints( boton0.add( boton1 ).java. AWT" ).*.setLayout( gridbag ). dentro del mismo programa. miFrame. con la apariencia que muestra la figura anterior. miFrame. GridBagLayout gridbag = new GridBagLayout().gbc ). miFrame. se ha implementado como muetra el ejemplo java1326. el consejo es que evite como la peste el uso del GridBagLayout. Button boton0 = new Button( "Botón 0" ). . Loa applets no apreciarán esta diferencia.0. // Para este grupo fijamos la anchura y vamos variando alguna // de las caracteristicas en los siguientes. gbc.setConstraints( boton1.gbc ).awt. GridBagConstraints gbc = new GridBagConstraints(). public class java1326 { public static void main( String args[] ) { IHM ihm = new IHM().setConstraints( boton2. Button boton2 = new Button( "Botón 2" ). gridbag. A pesar de los pesares.Si el lector acepta una recomendación. de tal forma que // los botones que aparecen en cada una de las lineas tengan // apariencia diferente en pantalla gbc. al menos no tanto como para justificar los problemas que conlleva el uso del GridBagLayout. porque tanta sofisticación lo único que acarrea son dolores de cabeza.weightx = 1.add( boton2 ). gridbag. Button boton1 = new Button( "Botón 1" ). miFrame.gbc ). siempre se puede recurrir a la técnica de combinar varios paneles utilizando otros controladores de posicionamiento. un pograma que presenta diez botones en pantalla. } } class IHM { public IHM() { Frame miFrame = new Frame( "Tutorial de Java. import java.BOTH.add( boton0 ). gridbag.fill = GridBagConstraints. y.

gbc ). hay que pintar antes en papel como van a estar posicionados los Componentes.gridwidth = 1.gridwidth = GridBagConstraints. miFrame. miFrame. gbc.gbc ). miFrame.gbc ). } } Para aprovechar de verdad todas las posibilidades que ofrece este layout.gridwidth = GridBagConstraints. gbc.REMAINDER.setConstraints( boton4.REMAINDER. Además.add( boton4 ).gbc ).setConstraints( boton9.add( boton5 ).0.setConstraints( boton8. Pero hay una luz en el horizonte.gbc ). gridbag.setConstraints( boton5. . miFrame.RELATIVE.REMAINDER. se deberían crear métodos de conveniencia para hacer más fácil el posicionamiento de los Componentes.setConstraints( boton7. Button boton5 = new Button( "Botón 5" ).gridheight = 2. gbc. gbc.add( boton8 ). utilizar gridx . gbc. gbc. miFrame. porque Swing incorpora un controlador de posicionamiento nuevo que utiliza la técnica que se ha popularizado con Smalltalk "Springs and Struts". Button boton7 = new Button( "Botón 7" ).0. Button boton9 = new Button( "Botón 9" ).weighty = 1.gridheight = 1.setConstraints( boton3. miFrame.gbc. Button boton8 = new Button( "Botón 8" ).weighty = 0.0. gridwidth y gridheight en vez de GridBagConstraints.gridwidth = GridBagConstraints. gridbag.RELATIVE. gridbag. gridbag.add( boton6 ).setSize( 250. Button boton6 = new Button( "Botón 6" ).gridwidth = GridBagConstraints. En resumen. miFrame.setVisible( true ). porque en el proceso de validación del layout pueden quedar todos los Componentes en posición indeseable.weightx = 0. lo cual redudirá significativamente la necesidad de tener que recurrir al GridBagLayout.setConstraints( boton6. miFrame. gridbag.add( boton3 ). miFrame. gridbag. que las complicaciones que genera el uso del GridBagLayout no compensan. Button boton4 = new Button( "Botón 4" ). Button boton3 = new Button( "Botón 3" ). gbc. gbc.add( boton9 ). gridbag.gbc ).150 ). gbc.gbc ).add( boton7 ). gridy.

import java.*. panel.setLayout( gridbag ). Más concretamente. import java. y por no dejar cojo en algún sentido al Tutorial. cada uno de los cuales puede ser ajustado para alterar la forma en que se presenta el Componentes dentro del layout. public java1332() { // Estos son los botones que se van a marear Button botAceptar. La forma de visualizarse este conjunto de celdas.BOTH. puede determinarse a través de una serie de características recogidas en un objeto de tipo GridBagConstraints.*.botCancelar.event. add( panel ).setBackground( Color.awt. son las que se van a describir a continuación. pero permite especificar una serie de parámetros adicionales para ajustar mejor la posición y tamaño de los Componentes dentro de las celdas. y ya que sea el propio lector el que intente probar suerte con él. a pesar de las advertencias. o propiedades. a continuación se tratan una serie de cuestiones para intentar explicar los parámetros y características que se pueden configurar dentro del GridBagLayout.fill = GridBagConstraints.No obstante. vertical // u horizontal gbc. quiere intentar la aventura de implementar su aplicación basándose en este controlador de posicionamiento. . Y.awt.java.white ). Este controlador de posicionamiento coloca los Componentes en filas y columnas. el número de filas totales y el tamaño de los Componentes. para determinar el número y tamaño de las celdas que va a colocar en la tabla. se van a modificar las características del objeto a la hora de manipula el posicionamiento de los dos botones de la parte inferior del panel. y también por si el lector. al contrario que ocurría con el GridLayout. public class java1332 extends Frame { Panel panel. // Este es el panel que contiene a todos los componentes panel = new Panel(). // Se crean los objetos del GridBag y se le asigna este // layout al panel GridBagConstraints gbc = new GridBagConstraints(). El objeto GridBagConstraints se inicializa a unos valores de defecto. GridBagLayout gridbag = new GridBagLayout(). las filas y columnas no tienen porque tener un tamaño uniforme. El controlador utiliza en número de Componentes en la fila más larga. El ejemplo java1332. es el que se va a utilizar para comprobar el efecto que causan las modificaciones en los parámetros del objeto GridBagConstraints. // Se indica que los componentes pueden rellenar la zona // visible en cualquiera de las dos direcciones. panel. Estas características.

tanto horizontal como verticalmente.gridwidth = GridBagConstraints. // Se crea otro campo de texto. como // el objeto GridBagConstraints que modifica su // posicionamiento gridbag. // Se hace que el campo de texto sea el siguiente objeto // después del último que haya en la fila.add( txtDireccion ). // Se pasan al layout tanto el campo de texto.25 ). // Se hace que el componente Label sea el único que se // sitúe en la línea que lo contiene gbc. labTitulo.setConstraints( labTitulo. // Finalmente se añade la etiqueta al panel.setEditable( true ). en este caso para recoger // la direccion del propietario del nombre anterior TextField txtDireccion = new TextField( "Direccion:". txtComent.setAlignment( Label. // Se pasan al layout tanto el componente Label.CENTER ). // Se crea la etiqueta que va a servir de título al // panel Label labTitulo = new Label( "GridBag Layout" ).setConstraints( txtNombre. Esto significa // que todavía se puede añadir uno o más componentes a // la fila. a continuación del campo de texto gbc.REMAINDER. en este // caso para recoger un supuesto nombre TextField txtNombre = new TextField( "Nombre:". // Se hace que este campo de texto sea el último // componente que se sitúe en la fila en que se // encuentre gbc. El objeto // GridBagConstraints de este contenedor pone la etiqueta // en una línea.gridwidth = GridBagConstraints.setText( "Comentarios:" ).25 ). txtComent.gbc ).setConstraints( txtDireccion.gridwidth = GridBagConstraints.add( labTitulo ).gbc ).// Se redimensionan las columnas y se mantiene su relación // de aspecto isgual en todo el proceso gbc. // Se pasan al layout tanto el campo de texto.0.gbc ).add( txtNombre ). como // el objeto GridBagConstraints que modifica su // posicionamiento gridbag.REMAINDER.25 ). // Ahora se crea uno de los campos de texto.RELATIVE. la redimensiona para que ocupe toda la // fila de la tabla. . // Se añade el campo de texto al panel panel. // y hace que las columnas se redimensionen de la misma // forma cuando la ventana cambie de tamaño panel.weightx = 1. // Se añade el campo de texto al panel panel. como // el objeto GridBagConstraints que modifica su // posicionamiento gridbag. // Se crea un área de texto para introducir las cosas // que quiera el que esté utilizando el programa TextArea txtComent = new TextArea( 3.

// Fijamos el título de la ventana y la hacemos // visible. para // ir mostrando el comportamiento del conjunto ante // esos cambios botAceptar = new Button( "Aceptar" ).RELATIVE.RELATIVE. miFrame. // Se añade el receptor de eventos de la ventana // para acabar la ejecución addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.add( txtComent ).gridheight = 1.fill = GridBagConstraints. // Se pasan al layout el botón y el objeto // GridBagConstraints gridbag. // Se añade el área de texto al panel panel.// Se pasan al layout tanto el área de texto.setVisible( true ). } } .add( botAceptar ). como // el objeto GridBagConstraints que modifica su // posicionamiento gridbag. sobre los que vamos a modificar las // propiedades del objeto GridBagConstraints que // controla su posicionamiento dentro del panel. // Se añade el botón al panel panel. } public static void main( String args[] ) { java1332 miFrame = new java1332().setConstraints( botCancelar. gbc.NONE. // Se hace que el botón "Cancelar" sea el último de // la fila en que se encuentre gbc. } } ).gridwidth = GridBagConstraints. // Se hace que su altura no se reescale gbc. // Se pasan al layout el botón y el objeto // GridBagConstraints gridbag.gbc ).setConstraints( txtComent. botCancelar = new Button( "Cancelar" ). // Hacemos que el botón "Aceptar" no sea el último // de la fila y que no pueda expandirse en ninguna // dirección gbc. // Se añade el botón al panel panel. miFrame. con los componentes en su interior miFrame.exit( 0 ).setConstraints( botAceptar.gbc ). // Estos son los dos botones de la parte inferior del // panel.pack().setTitle( "Tutorial de Java.add( botCancelar ). AWT" ).gbc ).gridwidth = GridBagConstraints.

gridx=GridBagConstraints.java. gridx y gridy Las propiedades gridx y gridy indican la fila y la columna. Si se incorpora el siguiente trozo de código al ejemplo java1332. en donde se va a colocar el Componente. A continuación se describen estos parámetros. el siguiente Componente se insertará en la columna 0 y fila 2. y la columna más a la izquierda corresponde a gridy=0.gbc ). Por ejemplo. coloca el Componente a la derecha del último Componente que se haya colocado en la fila. que indica que el Componente debe ser colocado en una fila/columna relativa a la fila/columna donde se ha colocado el último Componente. Cuando se añaden componente a una columna.RELATIVE. deberían proporcionar al lector una idea de lo que hace cada una de las características del objeto GridBagConstraints y de cómo se usa.NONE. Los valores para estos parámetros deben ser un entero correspondiendo a una casilla fila/columna explícita o el valor GridBagConstraints. gridbag. Si un Componente se ha insertado en la fila 2 y columna 1. // Se añade el botón al panel panel.gridx = 1.fill = GridBagConstraints. el siguiente Componente se insertará en la fila 2 y columna 2.RELATIVE. modificándolos sobre el ejemplo anterior. La primera fila de la parte superior es gridx=0.add( botAceptar ). respectivamente. cuando se añaden componentes a una fila.RELATIVE. gridy=GridBagConstraints.Tanto el código del ejemplo como los comentarios que se han insertado.RELATIVE coloca el Componente por debajo del último Componente que se haya añadido a la columna.gridwidth = GridBagConstraints. Si un Componente se ha insertado en la columna 0 y fila 1. . gbc.setConstraints( botAceptar.gridy = 3 gbc. gbc. para fijar nuevos valores de gridx y gridy: gbc.

excepto la última.gbc.gridheight = 2. . se observa que el resultado de la ejecución ahora es el mismo. Fijándolo a GridBagConstraints.java: gbc.fill = GridBagConstraints. se puede proporcionar un valor de gridheight más grande que la unidad y el Componente se expandirá por varias filas. // Se añade el botón al panel panel. en este caso. Si se añade el siguiente trozo de código al ejemplo principal java1332. gbc. gbc. se indica que el Componente debería ocupar el número de celdas que queden libres en la fila. es decir.VERTICAL. gbc. gbc. cuando sea el último o el siguiente al último de la fila. tal como reproduce la figura siguiente: Se puede fijar el valor de gridx y gridy para evitar la colocación secuencial de componentes que realiza el sistema por defecto.REMAINDER. ni GridBagConstraints.gridwidth = GridBagConstraints. Si se fija gridwidth a GridBagConstraints.gridy = 3 gridbag. En este contexto.gbc ). Sin embargo. Los valores por defecto son una fila de ancho y una columna de alto.REMAINDER tienen significado alguno. no hay forma de hacer que el Componente sea más ancho que una columna.gridx = 0. gridwidth y gridheight Los parámetros o propiedades gridwidth y gridheight indican el número de celdas en la zona de presentación que va a ocupar un determinado Componente. Cuando se indica que un Componente es el último o el siguiente al último Componente de la fila.add( botCancelar ). pero los botones Aceptar y Cancelar están cambiados de sitio.RELATIVE.setConstraints( botCancelar. Se puede conseguir que un Componente ocupe dos columnas de ancho indicando gridwith=2 o tres filas de alto con gridheight=3.0.NONE ni tampoco GridBagConstraints.RELATIVE se indica que el Componente debería ocupar todas las celdas que queden en la fila. gridwidth=1 y gridheight=1.weigthy = 1.

En la primera modificación. gbc. horizontalmente. lo que significa que cuando la ventana es redimensionada. verticalmente. . los componentes permanecen juntos y agrupados en el centro del contenedor. c. en el código.gridheight = 1.gridbag.gbc ).add( botAceptar ).NONE.gbc ). tal como se ha fijado en el código. pero permanecen agrupados en el centro. verticalmente. horizontalmente. los valores de estos parámetros son weightx=0 y weighty=0. gridbag. los componentes se expandirán en la dirección x. permiten que los componentes se redimensionen junto con la ventana.fill = GridBagConstraints. // Se añade el botón al panel panel.add( botCancelar ).0 y c. que es la imagen capturada de la ventana: En ella se puede observar que el botón Aceptar es dos veces más alto que el botón Cancelar.weigthy=0. los parámetros weightx y weighty determinan la forma en que se van a redimensionar. gbc. donde se alteraban los valores de gridx y gridy. los componentes se expandirán en la dirección y. se puede comprobar el efecto de estos parámetros. El resultado que se obtiene es el que se muestra en la figura que aparece a continuación. // Se añade el botón al panel panel. Si se proporciona un valor mayor que 0 para weightx.setConstraints( botCancelar.weigthx=1. weightx y weighty Cuando el usuario redimensiona una ventana que utiliza el GridBagLayout como controlador de posicionamiento de los componentes.setConstraints( botAceptar. Por defecto. En las dos modificaciones anteriores que se han hecho al ejemplo java1332. Si se proporciona un valor mayor que 0 para weighty.java.0.

java. en la que se reproduce el efecto causado por el código anterior. y los valores que puede tomar este parámetro pueden ser: GridBagConstraints. utilizando un valor para gridheight de 2 y un valor de fill fijado a GridBagConstraints. gbc. el valor de c.java para mostrar el efecto de la modificación de los parámetros gridwidth y gridheight.0. GridBagConstraints.NONE: El Componente es reducido a su tamaño ideal. pero siempre llena completamente la zona verticalmente. Como se puede observar en la figura siguiente. gridbag.BOTH y no hay ningún otro Componente en la segunda columna de la fila. los botones también ocupan completamente la fila. correspondiente a gridwidth y gridheight. porque hay dos botones y dos columnas. // Se añade el botón al panel panel.setConstraints( botCancelar. // Se añade el botón al panel panel.gridheight = 1.setConstraints( botAceptar.BOTH: El Componente se expande completamente para ocupar la totalidad del área de visualización.HORIZONTAL: El Componente se expande horizontalmente para rellenar todo el área de visualización.En la segunda modificación. se provocará el relleno completo de la zona de visualización en dirección horizontal. GridBagConstraints.0 a 1. el valor de c. gbc.BOTH a GridBagConstraints.weighty se ha cambiado de 0.VERTICAL y se utiliza con un valor de weighty fijado a 1 y un valor de 2 para gridheight.gridwidth = GridBagConstraints. pero se expande solamente en dirección vertical. así que el botón Aceptar se expande a dos filas. independientemente del tamaño que tenga la zona de visualización.RELATIVE. El área de texto también ocupa la fila completamente porque el parámetro fill está fijado a GridBagConstraints.fill se cambia de GridBagConstraints.VERTICAL: El Componente se expande verticalmente para rellenar todo el área de visualización. gbc.gbc ).add( botCancelar ). Si ahora se añade el siguiente trozo de código al ejemplo java1332. fill El parámetro fill determina la forma en que un Componente rellena el área definida por gridx/gridy/gridwidth/gridheight.gbc ).HORIZONTAL. esto hace que el botón aceptar ocupe dos filas.fill = GridBagConstraints. GridBagConstraints. gridbag.add( botAceptar ). En la modificación que se hizo del código del ejemplo java1332. .VERTICAL.

WEST. gbc.CENTER.RELATIVE.NONE. gbc.setConstraints( botCancelar.anchor Cuando un Componente es más pequeño que la zona de visualización. // Se añade el botón al panel panel. NORTHWEST. que es el que toma por defecto. NORTHEAST. gbc.fill = GridBagConstraints. mientras que el botón Cancelar sigue en el centro de su celda.java. La imagen siguiente reproduce la situación generada por la modificación anterior. SOUTHEAST.add( botCancelar ).gbc ).CENTER. que ya debe estar mareado del todo. gbc. . o cualquiera de las direcciones de los puntos cardinales: NORTH. Si se añade el siguiente trozo de código al ejemplo java1332. EAST.anchor = GridBagConstraints.anchor = GridBagConstraints. gbc.WEST. // Se añade el botón al panel panel. gridbag. SOUTH.gbc ). SOUTHWEST. el botón Aceptar se desplazará hacia la parte oeste de la fila.setConstraints( botAceptar.gridheight = 1. en la que se pueden observar las posiciones de los botones tal como se refiere.gridwidth = GridBagConstraints. se puede colocar en una determinada posición utilizando el parámetro anchor que puede tomar el valor GridBagConstrints.add( botAceptar ). gridbag.

fill = GridBagConstraints.gbc ). que el tamaño real que calcularía el controlador. Cuando se especifica un valor para ipady. gbc. gbc. ipady.java. pero los botones serán 25 píxels más anchos por cada lado. ya que el desplazamiento se añade por ambos lados del Componente. ipadx. el trozo de código que se reproduce a continuación. dos veces la cantidad que se haya indicado en ipady. gbc. porque si el Componente rellena la zona de visualización en la dirección equivocada. Si el fill es solamente vertical y no está fijado el fill horizontal. la altura total del Componente se calcula sumando a su altura real. gridbag. Centro o Sur no alterará en nada su apariencia. . si se tiene un Componente que se expande por dos filas y tiene un fill vertical.add( botAceptar ). Cuando se especifica un valor para ipadx. al estilo que hace el parámetro fill.RELATIVE. // Se añade el botón al panel panel.ipadx = 50. que no sean las tres anteriores. Si se incorpora al ejemplo java1332. dos veces la cantidad que se haya indicado en ipadx. el anclaje del Componente en el Norte. Por ejemplo. Los valores de defecto de ipadx e ipady son 0. hay que asegurarse de haber fijado el valor de fill adecuadamente. el ancho total del Componente se calcula sumando a su ancho real. sí que cambiará la posición del Componente sobre el área de visualización. se obtendrá como resultado una imagen semejante a las anteriores.setConstraints( botAceptar.gridwidth = GridBagConstraints. en anclaje del Componente puede quedar sin efecto.A pesar de ajustar este parámetro. ya que el desplazamiento se añade por arriba y por abajo del Componente.NONE. aunque no llegue a llenar completamente la zona de visualización en dirección horizontal o vertical. ipadx e ipady El controlador de posicionamiento calcula el tamaño de un Componente basándose en los parámetros del GridBagLayout y en los otros componentes que se encuentren sobre el layout. Se puede indicar un desplazamiento interno para incrementar el tamaño calculado para un Componente y hacer que ese Componente sea más ancho. el anclaje en cualquiera otra de las posiciones. o más alto.

observándose que efectivamente los botones son más anchos que los de los ejemplos anteriores.setConstraints( botCancelar. . // Se añade el botón al panel panel. y no llegan a ocupar toda la fila como en el caso de fill. gridbag. o una imagen o un título. La imagen siguiente muestra el efecto del código anterior. Por defecto. al cual se le especifica el espacio que se quiere dejar en cada uno de los cuatro lados del Componente. insets El parámetro insets permite especificar la mínima cantidad de espacio que debe haber entre el Componente y los bordes del área de visualización. pero también se puede rellenar con un color. que seguro es más comprensible que lo escrito. La imagen siguiente muestra el gráfico explicativo. el espacio determinado por insets se deja en blanco. Como valor de este parámetro hay que pasarle un objeto de tipo Insets.add( botCancelar ).gbc ).gridheight = 1.gbc.

fill = GridBagConstraints.java. el llegar a dominar los parámetros que lo pueden modificar no es nada sencillo y lo más habitual es que se generen efectos visuales indeseados a la hora de redimensionar la ventana.RELATIVE. // Se añade el botón al panel panel.gbc ). o incluso una combinación de ellos. el autor recomienda al lector que si puede utilizar cualquier otro controlador de posicionamiento.0.add( botCancelar ). gbc. que evite el uso de GridBagLayout.Si se añade el siguiente trozo del código al ejemplo java1332. porque su dominio no es sencillo y. Sin embargo. el GridBagLayout es el más poderoso y flexible de los controladores de posicionamiento que proporciona el AWT. nunca se está seguro de cómo se va a comportar.setConstraints( botAceptar.gridheight = 1. Por ello.es/~bmoros/Tutorial/parte13/cap13-9. gbc.setConstraints( botCancelar. además. La imagen siguiente reproduce el efecto generado por la modificación anterior.add( botAceptar ).NONE. gridbag. http://dis.gridwidth = GridBagConstraints. en donde se puede observar el desplazamiento comentado. // Se añade el botón al panel panel. gbc. se ampliará en 15 pixels el espacio que hay entre la fila en que se encuentran los botones Aceptar y Cancelar y el área de texto que está por encima. gridbag. Como se puede observar.um.0.html .gbc ). gbc.0 ). incluso prestando suficiente atención en la asignación de los valores de los parámetros.insets = new Insets( 15.