Uso del GridBagLayout

3361 vistas

¡El terror del novato! Como el GridLayout, este gestionador permite posicionar los componentes en una rejilla, pero con más flexibilidad. El GridBagLayout funciona como una tabla en la que las celdas pueden fusionarse.

Para colocar los componentes tendremos que:

  • instanciar un GridBagLayout y pasarlo como gestionador de contenedor
  • definir un GridBagConstraints para cada componente
  • añadir cada par componente/GridBagConstraints al contenedor

Estas son las condiciones que determinarán la posición de los componentes y el comportamiento en caso de redimensionado de la ventana. Los parámetros de un GridBagConstraints son:

  • gridx, gridy (int): número de lÃnia y columna de la esquina superior izquierda de la zona donde se mostrará el componente.
  • gridwidth, gridheight (int): ancho y alto del componente en número de celdas.
  • fill (int): comportamiento del componente durante el redimensionado si su medida y la de la zona de mostrado no se corresponden.
  • anchor (int): alineamiento del componente en la zona de mostrado.
  • weigthx, weigthy (double): comportamiento de la zona de mistrado e caso de redimensionado de la tabla.
  • ipadx, ipady (int): valores de la medida mÃnima del componente
  • insets (Insets): define los márgenes alrededor del componente.

La documentación AWT recomienda reemplzar la definición de los parámetros gridx y gridy en valores absolutos por la constante GridBagConstraints.RELATIVE.

Para indicar que un componente es el último de una línea, daremos a la longitud de su zona de mostrado (gridwidth) el valor GridBagConstraints.REMAINDER. Daremos este mismo valor a la altura de la zona de mostrado de los componente de la última línea.

Fases para usar un GridBagLayout:

    [1]  Visualizar en papel la posición de los componentes.
    [2]  Establecer el tamaño de las celdas de la rejilla para ocupar los componentes más pequeños.
    [3]  Borrado de líneas y columnas. Este borrado dará los valores de gridx, gridy, gridwidth, gridheight.
    [4]  Definir el redimensionado (fill) y la alineación (anchor) de los componentes.
    [5]  Poner las cargas (weightx et weigthy) a 100, lo ajustaremos luego. 0 para los componente que conservarán la medida dada por defecto.
    [6]  Escribie el código.
    [7]  Compilar, ejecutar y ajustar las cargas.

Ejemplo de uso del GridBagLayout:



java
  1. class FontDialogFrame extends JFrame
  2. {
  3.   public FontDialogFrame()
  4.   {
  5.       setTitle("FontDialog");
  6.       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
  7.       GridBagLayout layout = new GridBagLayout();
  8.       getContentPane().setLayout(layout);
  9.       ActionListener listener = new FontAction();
  10.  
  11.       // contrucción de los componentes
  12.       JLabel faceLabel = new JLabel("Face: ");
  13.       face = new JComboBox(new String[]
  14.         {
  15.             "Serif", "SansSerif", "Monospaced",
  16.             "Dialog", "DialogInput"
  17.         });
  18.       face.addActionListener(listener);
  19.       JLabel sizeLabel = new JLabel("Size: ");
  20.       size = new JComboBox(new String[]
  21.         {
  22.             "8", "10", "12", "15", "18", "24", "36", "48"
  23.         });
  24.       size.addActionListener(listener);
  25.       bold = new JCheckBox("Bold");
  26.       bold.addActionListener(listener);
  27.       italic = new JCheckBox("Italic");
  28.       italic.addActionListener(listener);
  29.       sample = new JTextArea();
  30.       sample.setText("hay que teclar código...");
  31.       sample.setEditable(false);
  32.       sample.setLineWrap(true);
  33.       sample.setBorder(BorderFactory.createEtchedBorder());
  34.  
  35.       // construcción de constraints y añadir las parejas componente/constraint
  36.       GridBagConstraints c1 = new GridBagConstraints();
  37.       c1.gridx = 0;
  38.       c1.gridy = 0;
  39.       c1.anchor = GridBagConstraints.EAST;
  40.       getContentPane().add(faceLabel,c1);
  41.       GridBagConstraints c2 = new GridBagConstraints();
  42.       c2.gridx = 1;
  43.       c2.gridy = 0;
  44.       c2.fill = GridBagConstraints.HORIZONTAL;
  45.       c2.weightx = 100;
  46.       c2.weighty = 0;
  47.       c2.insets = new Insets(1,0,0,0);           
  48.       getContentPane().add(face,c2);
  49.       GridBagConstraints c3 = new GridBagConstraints();
  50.       c3.gridx = 0;
  51.       c3.gridy = 1;
  52.       c3.anchor = GridBagConstraints.EAST;
  53.       add(sizeLabel,c3);
  54.       GridBagConstraints c4 = new GridBagConstraints();
  55.       c4.gridx = 1;
  56.       c4.gridy = 1;
  57.       c4.weightx = 100;
  58.       c4.weighty = 0;
  59.       c4.insets = new Insets(1,0,0,0);
  60.       getContentPane().add(size,c4);
  61.       GridBagConstraints c5 = new GridBagConstraints();
  62.       c5.gridx = 0;
  63.       c5.gridy = 2;
  64.       c5.gridwidth = 2;
  65.       c5.gridheight = 1;
  66.       c5.anchor = GridBagConstraints.CENTER;
  67.       c5.weightx = 100;
  68.       c5.weighty = 100;
  69.       getContentPane().add(bold,c5);
  70.       GridBagConstraints c6 = new GridBagConstraints();
  71.       c6.gridx = 0;
  72.       c6.gridy = 3;
  73.       c6.gridwidth = 2;
  74.       c6.gridheight = 1;
  75.       c6.anchor = GridBagConstraints.CENTER;
  76.       c6.weightx = 100;
  77.       c6.weighty = 100;
  78.       getContentPane().add(italic,c6);
  79.       GridBagConstraints c7 = new GridBagConstraints();
  80.       c7.gridx = 2;
  81.       c7.gridy = 0;
  82.       c7.gridwidth = 1;
  83.       c7.gridheight = 4;
  84.       c7.fill = GridBagConstraints.BOTH;
  85.       c7.weightx = 100;
  86.       c7.weighty = 100;
  87.       getContentPane().add(sample,c7);
  88.   }
  89.  
  90.   public static final int DEFAULT_WIDTH = 300;
  91.   public static final int DEFAULT_HEIGHT = 200;
  92.   private JComboBox face;
  93.   private JComboBox size;
  94.   private JCheckBox bold;
  95.   private JCheckBox italic;
  96.   private JTextArea sample;
  97.  
  98.   private class FontAction implements ActionListener
  99.   {
  100.       public void actionPerformed(ActionEvent event)
  101.       {
  102.         String fontFace = (String) face.getSelectedItem();
  103.         int fontStyle = (bold.isSelected() ? Font.BOLD : 0)
  104.             + (italic.isSelected() ? Font.ITALIC : 0);
  105.         int fontSize = Integer.parseInt((String) size.getSelectedItem());
  106.         Font font = new Font(fontFace, fontStyle, fontSize);
  107.         sample.setFont(font);
  108.         sample.repaint();
  109.       }
  110.   }
  111. }