Gestores de Diseño: BoxLayout y CardLayout

Clase BoxLayout

java.lang.Object
java.awt.BoxLayout
La clase BoxLayout, único gestor perteneciente al paquete swing, ordena los componentes de un contenedor de manera de flujo horizontal de igual manera que flowLayout pero tambien permite organizarlos de forma vetical.
La idea es ordenar los componentes como si fueran "cajas" y apilarlos tanto de izquierda a derecha como de abajo hacia arriba, lo que me recuerda el juego de android "move the box":

Constructores:

  • BoxLayout(Container target, int axis)
    • Único constructor con 2 parámetros: El contenedor al que se le aplique el gestor y que forma de apilar para los componentes que vayan dentro.
    • Los posibles valores son las variables de clase.

Variables:

  • X_AXIS
    • Especifica que los componentes deben estar dispuestos de izquierda a derecha.
  • Y_AXIS
    • Especifica que los componentes deben estar dispuestos de arriba a abajo.
  • LINE_AXIS
    • Especifica que los componentes deben estar dispuestos en la dirección de una línea de texto según lo determinado por la propiedad ComponentOrientation del contenedor de destino.
  • PAGE_AXIS
    • Especifica que los componentes deben estar dispuestos en la dirección de que las líneas de flujo a través de una página según lo determinado por la propiedad ComponentOrientation del contenedor de destino.

  1. package gestores;
  2. import java.awt.*;
  3. import javax.swing.*;
  4. public class Caja {
  5.     public static void main(String[] args) {
  6.         JPanel panel = new JPanel();
  7.         JPanel panel2 = new JPanel();
  8.         JButton btn1 = new JButton("1");JButton btn2 = new JButton("2");
  9.         JButton btn3 = new JButton("3");JButton btn4 = new JButton("4");
  10.         JButton btn5 = new JButton("5");JButton btn6 = new JButton("6");
  11.         JButton btn7 = new JButton("7");JButton btn8 = new JButton("8");
  12.         JButton btn9 = new JButton("9");
  13.         JFrame marco = new JFrame();
  14.         marco.setTitle("BoxLayout");
  15.         marco.setSize(278,218);
  16.         marco.setLocationRelativeTo(null);
  17.         marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  18.        
  19.         marco.setLayout(new FlowLayout());
  20.        
  21.         BoxLayout caja = new BoxLayout(panel, BoxLayout.PAGE_AXIS);
  22.         panel.setLayout(caja);
  23.         panel.add(btn1);panel.add(btn2);panel.add(btn3);
  24.         marco.add(panel);
  25.        
  26.         panel2.setLayout(new BoxLayout(panel2, BoxLayout.LINE_AXIS));
  27.         panel2.add(btn4);panel2.add(btn5);panel2.add(btn6);
  28.         marco.add(panel2);
  29.        
  30.         marco.setVisible(true);
  31.     }
  32. }



Clase CardLayout

java.lang.Object
java.awt.CardLayout
El gestor CardLayout trata a cada contenedor como una carta o tarjeta.
Sólo una carta es visible a la vez, y el contenedor actúa como una pila de tarjetas.
Es decir 2 o más contenedores ocupan el mismo espacio dentro de una GUI pero solo una es visible. Seguramente sea más fácil de entender con las "pestañas" de nuestro navegador de internet, donde muestra varias paginas pero no todas a la vez, sino organizadas en pestañas.

Ejemplo

Para este ejemplo, se necesita de "vigilantes de escucha"(ActionListener) para que se vea, como al hacer un simple click cambie el contenedor. Los eventos de usuarios será nuestro siguiente tema:
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. public class Cartas2 implements ActionListener {
  5.     JFrame marco;
  6.     CardLayout carta;
  7.     JPanel superior, inferior, panel1, panel2;
  8.     JButton btn1, btn2, btn3;
  9.     JTextField campo;
  10.     JComboBox combo;
  11.     String [] cadena = {"Panel con botones","Panel con Campo de texto"};
  12.     public Cartas2(){
  13. //construir panel superior
  14.         superior = new JPanel();
  15.         superior.setLayout(new FlowLayout());
  16.         combo = new JComboBox(cadena);        
  17.         superior.add(combo);
  18.        
  19. //construir panel 1
  20.         panel1 = new JPanel(new FlowLayout());
  21.         btn1 = new JButton("Boton 1");
  22.         panel1.add(btn1);
  23.         btn2 = new JButton("Boton 2");
  24.         panel1.add(btn2);
  25.         btn3 = new JButton("Boton 3");
  26.         panel1.add(btn3);
  27.    
  28. //construir panel 2
  29.         panel2 = new JPanel(new FlowLayout());
  30.         campo = new JTextField("Escribe algo...", 15);
  31.         panel2.add(campo);
  32. //construir panel inferior que contiene a A y B
  33.         inferior = new JPanel();
  34.         carta = new CardLayout();
  35.         inferior.setLayout(carta);
  36.        
  37.         /* **********************************************
  38.          Al agregar componentes se necesitan 2 argumentos:
  39.             -El mismo componente a agregar
  40.             -Un nombre de referencia, necesario para el método show(Container parent,String name) de CardLayout
  41.         ********************************************** */
  42.         inferior.add(panel1, "panel1");
  43.         inferior.add(panel2, "panel2");
  44.        
  45. //Constuir ventana
  46.         marco = new JFrame();
  47.         marco.setTitle("Card Layout");
  48.         marco.setSize(290, 110);
  49.         marco.setLocationRelativeTo(null);
  50.         marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  51.         marco.setLayout(new BoxLayout(marco.getContentPane(),BoxLayout.Y_AXIS));
  52.         marco.add(superior);
  53.         marco.add(inferior);
  54.         marco.setVisible(true);
  55.        
  56.         //agregar vigilante de escucha
  57.         combo.addActionListener(this);
  58.     }    
  59.    
  60.     public static void main (String [] inforux){
  61.         new Cartas2();
  62.     }
  63.    
  64.     public void actionPerformed (ActionEvent evento){
  65.         if (evento.getSource()== combo){
  66.             if (combo.getSelectedIndex()==0){
  67.                 carta.show(inferior, "panel1");
  68.             }
  69.             if (combo.getSelectedIndex()==1){
  70.                 carta.show(inferior, "panel2");
  71.             }
  72.         }  
  73.     }
  74.    
  75. }
Como resultado, al seleccionar "panel con campo de texto" cambiara el contenedor 2 y 3/4 de lo mismo si seleccionamos la otra opción.

Otra idea es usar los demás métodos de la clase "card".
En lugar de usar de un comboBox, 2 botones mas para ir atrás y adelante con las "cartas".
Declaramos más botones globales:


        JButton
siguiente, anterior;

Los inicializamos y los agregamos al panel superior:


        anterior = new JButton("Anterior");
        superior.add(anterior);
        siguiente = new JButton("Siguiente");
        superior.add(siguiente);

Le agregamos los vigiladores:


        anterior.addActionListener(this);
        siguiente.addActionListener(this);

En el método "actionPerformed" le implementamos los métodos next y previous:


    public void actionPerformed (ActionEvent evento){
        if (evento.getSource()== anterior){
            carta.previous(inferior);
        }
        if (evento.getSource()== siguiente){
            carta.next(inferior);
        }  
    }


No hay comentarios:

Publicar un comentario