Universidad Autónoma de Baja California Facultad de Ingeniería Apuntes de Programación Orientada a Objetos I Layout Managers Un layout manager es un objeto que controla el tamaño y posición de los componentes de un contenedor. Aun cuando se puede indicar el tamaño y alineación de los componentes a mostrar, el layout manager es el controla finalmente la posición y tamaño de éstos. Como establecer un layout manager En general, solo se tiene que indicar el layout manager de los JPanel y de los content pane. Por defecto, un objeto JPanel utiliza FlowLayout, mientras que un content pane utiliza un BorderLayout. Para cambiar el layout manager de un contenedor, se puede especificar el nuevo layout manager desde el constructor como se aprecia en el primer ejemplo. Ejemplo JPanel panel = new JPanel( new BorderLayout() ); También puede cambiarse el layout manager después de que se ha creado el contenedor como se ve en el siguiente ejemplo. Ejemplo Container conentPane = frame.getContentPane(); contentPane.setLayout(new FlowLayout()); 1 de 8 Elaborado por: M.C. Cecilia M. Curlango Rosas Universidad Autónoma de Baja California Facultad de Ingeniería Apuntes de Programación Orientada a Objetos I Cómo agregar componentes a un contenedor Cuando se agregan componentes a un contenedor, panel o content pane, los parámetros del método add que se utilizan dependen del layout manager que se esté utilizando. Como en el ejemplo siguiente en el que se agrega un componente a un pane que tiene un BorderLayout. Ejemplo pane.add(unComponente, BorderLayout.PAGE_START); Para cada layout manager existe una sección en la que se detallan los argumentos requeridos por el método add. Sugerencias de tamaño y alineación Las dimensiones de los componentes son controlados por el layout manager sin embargo, éstos pueden tener sugerencias en cuanto a su tamaño y alineación que pueden o no ser tomadas en cuenta por el layout manager. La mayoría de los layout managers no toman en cuenta las sugerencias pero BoxLayout y SpringLayout si. Las dimensiones pueden establecerse utilizando los métodos que los componentes tienen para este fin como son: setMinimumSize, setPreferredSize y setMaximumSize. El siguiente ejemplo muestra una forma de establecer la dimensiones de un componente al tamaño máximo utilizando el objeto Dimension. Ejemplo component.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE)); 2 de 8 Elaborado por: M.C. Cecilia M. Curlango Rosas Universidad Autónoma de Baja California Facultad de Ingeniería Apuntes de Programación Orientada a Objetos I Espacios entre componentes Existen tres factores que influyen en la cantidad de espacio que aparece entre componentes de un contenedor. El layout manager Algunos layout managers colocan espacio entre los componentes automaticamente y algunos permiten especificar la cantidad de espacio entre componentes. Componentes invisibles Se pueden crear componentes ligeros que no se dibujan pero que ocupan espacio en la interfaz gráfica. Bordes vacios En todos los layout managers se pueden utilizar bordes vacios para insertar espacio entre componentes. Los mejores componentes para esto son panel y label ya que normalmente no tienen bordes por defecto. Selección de layout managers Los layout managers tienen distintas fortalezas y debilidades. Al seleccionar uno deben considerarse éstas y tener una idea clara de lo que se quiere hacer. FlowLayout Acomoda los componentes de izquierda a derecha, como las líneas de un párrafo. Cada línea esta centrada. Se acomodan en cada línea tantos componentes como quepan. La Figura 1 muestra como se acomodan los componentes en un FlowLayout. En este caso, como se puede ver en el 3 de 8 Elaborado por: M.C. Cecilia M. Curlango Rosas Universidad Autónoma de Baja California Facultad de Ingeniería Apuntes de Programación Orientada a Objetos I Listado 1 no se especifica que se utilizará un FlowLayout debido a que es el layout manager que tiene los applets por defecto. Figura 1 Ejemplo de FlowLayout 1 import java.awt.*; 2 import java.applet.Applet; 3 4 public class flowLayout extends Applet { 5 Button boton1, boton2, boton3; 6 public void init() { 7 boton1 = new Button("OK"); 8 boton2 = new Button("Abrir"); 9 boton3 = new Button("Cerrar"); 10 // Por default el layout manager es FlowLayout 11 add(boton1); 12 add(boton2); 13 add(boton3); 14 } 15 } Listado 1 Ejemplo flowLayout.java 4 de 8 Elaborado por: M.C. Cecilia M. Curlango Rosas Universidad Autónoma de Baja California Facultad de Ingeniería Apuntes de Programación Orientada a Objetos I BorderLayout Acomoda los componentes en cinco regiones denominadas NORTH, SOUTH, EAST, WEST y CENTER que corresponden a los puntos cardinales y el centro. Cuando se agrega un componente a un contenedor que tiene este layout se debe especificar el sitio en el que se desea colocar el componente. Si se omite esta especificación, entonces el componente se colocará en el centro por defecto. La Figura 2 muestra como se acomodan los componentes con un BorderLayout. En el Listado 2 ejemplifica otra forma de agregar componentes a un contenedor. Además si se elimina el comentario de la línea 14 se podrá comprobar un comportamiento que tiene este layout que es que solo se puede colocar un componente en cada posición y que si se agregan mas de uno, el último sobreescribre al primero. Figura 2 Ejemplo de BorderLayout 5 de 8 Elaborado por: M.C. Cecilia M. Curlango Rosas Universidad Autónoma de Baja California Facultad de Ingeniería Apuntes de Programación Orientada a Objetos I 1 import java.awt.*; 2 import java.applet.Applet; 3 4 public class borderLayout extends Applet { 5 public void init() { 6 setLayout( new BorderLayout() ); 7 // el layout manager es FlowLayout 8 add(new Button("Norte"), BorderLayout.NORTH); 9 add(new Button("SUR"), BorderLayout.SOUTH); 10 add(new Button("Este"), BorderLayout.EAST); 11 add(new Button("Oeste"), BorderLayout.WEST); 12 add(new Button("Centro"), BorderLayout.CENTER); 13 // sobreescribe al boton anterior 14 // add(new Button("Otro Centro")); 15 } 16 } Listado 2 Ejemplo borderLayout.java GridLayout Acomoda los componentes en una cuadricula. El contenedor se divide en secciones rectangulares de tamaños iguales y se coloca un componente dentro de cada sección. La Figura 3 muestra la apariencia que tiene este layout mientras que el Listado 3 contiene el código utilizado para producir la figura mostrada. 6 de 8 Elaborado por: M.C. Cecilia M. Curlango Rosas Universidad Autónoma de Baja California Facultad de Ingeniería Apuntes de Programación Orientada a Objetos I Figura 3 Ejemplo GridLayout 7 de 8 Elaborado por: M.C. Cecilia M. Curlango Rosas Universidad Autónoma de Baja California Facultad de Ingeniería Apuntes de Programación Orientada a Objetos I 1 import java.awt.*; 2 import java.applet.Applet; 3 4 public class gridLayout extends Applet { 5 public void init() { 6 setLayout( new GridLayout(3,2) ); 7 add(new Button("1")); 8 add(new Button("2")); 9 add(new Button("3")); 10 add(new Button("4")); 11 add(new Button("5")); 12 add(new Button("6")); 13 } 14 } Listado 3 Ejemplo gridLayout.java 8 de 8 Elaborado por: M.C. Cecilia M. Curlango Rosas