JAVA: Practicando con CardLayout

19 03 2009

CardLayout,  es un manejador de disenio que nos permite, ubicar componentes swing dentro de un mismo contenedor, y poder visualizarlos solamente uno a la vez.

Este layout es usado por los JTabbedPane, con la diferencia de la separacion de los bordes de cada panel.

Es decir, podemos tener un contenedor pricipal,   y dentro de el, varios paneles, y atravez de una seleccion, elegir cual de estos paneles queremos q se visualize.

Primero tenemos que crear el contenedor(JFrame, JPanel, etc), y luego atravez del metodo “setLayout()” asignarle el layout correspondiente.

JFrame frame = new JFrame();
frame.setLayout(new CardLayout());

Una vez, asiganado el layout al contenedor, tendremos q agregar los componentes, plenamente ya declarados y creados.

Para agregar necesitamos 2 argumentos, el objeto a agregar, y un nombre referencial al elemento agregado

JPanel panel = new JPanel();
JPanel pane2 = new JPanel();
frame.add(panel, referenciaPanel1);
frame.add(pane2, referenciaPanel2);

Sencilo no?, espera, hay unos metodos basicos e importantes, al momento de manejar los eventos, como son.

first (nombreContenedor) -> metodo q permite visualizar el primer objeto agregado

next (nombreContenedor) -> metodo q permite visuliza el objeto siguiente.

previous (nombreContenedor) -> permite visualizar el objeto anterior

show (nombreContenedor, referenciaPanel) -> permite visualizar un obejto especificado, aqui necesitamos el nombre del contenedor y el nombre referencial asignado al momento de agregarlo.

Para esta entrada he preparado un ejemplo clasico, para situaciones clasicas…jejee

La aplicacio, contiene, 1 JFrame principal, 1 PanelSuperior incluido en el JFrame,1 JComboBox incluido en el PanelSuperior, 1 PanelInferior incluido en el JFrame, y 3 paneles incluidos en el PanelInferior.

El ejemplo consciste en que atravez de un JComboBox, seleccionaremos un elemento de la lista, y segun el elemento seleccionado, cambiara el panel inferior mostrando uno de los paneles incluidos en el., es decir, el panel ira cambiando segun la seleecion del elemento de la lista del JComboBox.

YA q en este ejericcio he utilizado manejo de eventos, he trabajado con 2 clases, la primera (WindowCardLayout) es la interfaz de usuario y la segunda (ControlCardLayout) la q maneja los eventos de la primera.

Aqui el fuente.WindowCardLayout

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JPanel;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JComboBox;
import javax.swing.WindowConstants;
import javax.swing.BorderFactory;
import java.awt.FlowLayout;
import java.awt.CardLayout;
import java.awt.Color;

public class WindowCardLayout{

    JFrame frame;
    CardLayout cardLayout;
    JPanel panelSuperior, panelInferior,panelInf1, panelInf2, panelInf3;
    JLabel etiqueta, etiqueta1, etiqueta2,etiqueta3;
    JComboBox combo;
    String [] vectorCadena = {"panel1","panel2","panel3"};

    public WindowCardLayout(){/*Constructor*/
        construyePanelSuperior();
        construyePanelInf1();
        construyePanelInf2();
        construyePanelInf3();
        construyePanelInferior();
        construyeVentana();}

    public void construyePanelSuperior(){
        etiqueta = new JLabel("Elegir Opcion");
        panelSuperior=new JPanel();
        panelSuperior.setBorder(BorderFactory.createTitledBorder("Demo por INFORUX"));
        combo = new JComboBox(vectorCadena);
        panelSuperior.setLayout(new FlowLayout());
        panelSuperior.add(etiqueta);
        panelSuperior.add(combo);
        panelSuperior.getPreferredSize();}

    public void construyePanelInferior(){
        panelInferior= new JPanel();
        panelInferior.setBorder(BorderFactory.createTitledBorder("Panel Inferior"));
        cardLayout=new CardLayout();
        panelInferior.setLayout(cardLayout);
        /*Al agregar necesitamos 2 argumentos, el objeto a agregar y un nombre referencial */
        panelInferior.add(panelInf1, "panel1");
        panelInferior.add(panelInf2, "panel2");
        panelInferior.add(panelInf3, "panel3");}

    public void construyePanelInf1(){
        etiqueta1 = new JLabel("Has Seleccionado el Panel 1");
        panelInf1 = new JPanel(new FlowLayout());
        panelInf1.setBackground(Color.white);
        panelInf1.add(etiqueta1);}

    public void construyePanelInf2(){
        etiqueta2 = new JLabel("increiblemente estas viendo el panel2");
        panelInf2 = new JPanel(new FlowLayout());
        panelInf2.setBackground(Color.orange);
        panelInf2.add(etiqueta2);}

    public void construyePanelInf3(){
        etiqueta3 = new JLabel("CardLayout permite solo uno a la vez, esta vez el panel 3");
        panelInf3 = new JPanel(new FlowLayout());
        panelInf3.setBackground(Color.green);
        panelInf3.add(etiqueta3);}

    public void construyeVentana(){
        frame= new JFrame();
        frame.setLayout(new BoxLayout(frame.getContentPane(),BoxLayout.Y_AXIS));
        frame.add(panelSuperior);
        frame.add(panelInferior);
        frame.getPreferredSize();
        frame.pack();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
        //creamos el objeto controlador de eventos
        ControlCardLayout control= new ControlCardLayout(this);
        combo.addActionListener(control);}

    public static void main (String [] inforux){
        new WindowCardLayout();
    }

}


Aqui el fuente ControlCardLAyout

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ControlCardLayout implements ActionListener{

WindowCardLayout ventana;
public ControlCardLayout( WindowCardLayout frame){
       ventana = frame ;}
public void actionPerformed (ActionEvent evento){
  if (evento.getSource()==ventana.combo){
     if (ventana.combo.getSelectedIndex()==0){
               ventana.cardLayout.show(ventana.panelInferior, "panel1");}
     if (ventana.combo.getSelectedIndex()==1){
               ventana.cardLayout.show(ventana.panelInferior, "panel2");}
     if (ventana.combo.getSelectedIndex()==2){
               ventana.cardLayout.show(ventana.panelInferior, "panel3");}}
   }
}

Listo una compilada y ejecutamos

$ javac WindowCardLayout.java
$ java WindoCardLayout

El resultado sera asi:
pantallazo1
pantallazo-1


Acciones

Information

12 responses

20 03 2009
Antonio

Gracias, era justo loq necesitaba.
saludos amigo.

20 04 2009
sdarknot

esta muy interesante me podrias mandar el codigo pa chequearlo
mi correo es sdarknot@gmail.com desde ya gracias

20 04 2009
inforux

Los fuentes del demo,estan expuestos (ControlCardLayout y windowCardLayout).
Ambos estan el la entrada.
Saludos.

22 08 2009
Nelson Abel

Miguel , realmente me ha sorprendido tu evolución en java has aprendido muy rapido se nota que tienes sangre guerrera saludos sigue asi , esto te lo digo por que las cosas buenas se tienen que reconocer. saludos tu amigo nelson. chau

7 10 2009
Marcos Roberto

Muy buena la entrada, es util para los que recien iniciamos en el mundo swing

9 04 2012
Anónimo

Excelente gracias una semana buscando

6 04 2013
mau

me arroja una excepción cuando llamo al programa en el main, sabes pro que?
Exception in thread “main” java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1041)
at java.awt.Container.add(Container.java:923)
at PruebaPanel.construyePanel2(PruebaPanel.java:52)
at PruebaPanel.(PruebaPanel.java:27)
at PruebaPanel.main(PruebaPanel.java:107)

Para mi “prueba panel es tu clase window card layout”

17 07 2013
Ricardo Sauceda Rojas

Gracias eres muy bueno en esto, muchas gracias,
espero puedas correrme algunos tips para aprender
a programar, oh recomendarme algo🙂
que estes bien!

18 08 2013
Gonzalo Pereira

excelente, me has ayudado un monton

12 01 2014
Koalt

Exelente: solo tengo la duda en esta linea
ControlCardLayout control = new ControlCardLayout(this);

El this que viene siendo, el contructor de la propia clase? el objeto frame creado dentro del metodo construyeVentana o el propio metodo construyeVentana?

Gracias.

2 04 2014
Marçal Gómez Lavall

PUTO AMO, IDOLO

10 09 2014
sdlscl

Muchas gracias, es lo que buscaba😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: