CardLayout
El CardLayout permite organizar paneles en forma de una pila de cartas vista desde
arriba; de esta forma el observador sólo puede ver la carta superior.
Organización de los paneles
Para explicar el funcionamiento del CardLayout programaremos la ventana que se
muestra a continuación.
Para lograr que la ventana cambie su apariencia (ver figura anterior)
dependiendo del valor del checkBox, los paneles que se apilarán como
cartas, dentro de un CardLayout, son:
 |
panelLogin = new JPanel(new GridLayout(2,1));
panelData = new JPanel(2,2);
//Panel de captura de datos
panelData = new JPanel(new GridLayout(2,2));
panelData.add(this.lblUser);
panelData.add(this.txtFldUser);
panelData.add(this.lblPasswd);
panelData.add(this.txtFldPasswd);
panelData.setBorder(new EmptyBorder(10,10,10,10));
//Panel para los botones
this.panelBtns = new JPanel();
this.panelBtns.add(this.btnOk,BoxLayout.X_AXIS);
this.panelBtns.add(this.btnPasswd,BoxLayout.X_AXIS);
//Panel de logeo
panelLogin.add(panelData);
panelLogin.add(panelBtns);
|
panelLogin |
|
panelSolicitaPasswd = new JPanel(new GridLayout(2,1));
panelSolPasswdData = new JPanel();
panelBtnsSolPasswd = new JPanel();
//Panel para los datos de solicitud de password.
this.panelSolPasswdData.add(this.txtFldCorreo,BoxLayout.X_AXIS);
this.panelSolPasswdData.add(this.lblCorreo,BoxLayout.X_AXIS);
//Panel para los botones
this.panelBtnsSolPasswd.add(this.btnSolPasswd, BoxLayout.X_AXIS);
this.panelBtnsSolPasswd.add(this.btnBorraCorreo, BoxLayout.X_AXIS);
//Panel de solicitud de password
panelSolicitaPasswd.add(this.panelSolPasswdData);
panelSolicitaPasswd.add(this.panelBtnsSolPasswd);
|
 |
|
panelSolPasswd |
El panel del JFrame (el que se consigue mediante el método
getContentePane()) tendrá un layout de tipo
BorderLayout, como se muestra en la figura:
En la parte Norte de este panel colocaremos un panel
con el checkBox
mientras que en la región central
colocaremos el panel con el CardLayout (cards) que contiene a los paneles que
el usuario vera cambiar (panelLogin y panelSolPasswd).
 |
//Construye el panel con un CardLayout
cards = new JPanel(new CardLayout());
...
//Pon los paneles en el panel con el CardLayout
cards.add(panelLogin,"Panel con datos de identificacion");
cards.add(panelSolicitaPasswd, "Panel para la solicitud de clave");
...
//A la ventana
this.getContentPane().add(this.panelSelector,BorderLayout.NORTH);
this.getContentPane().add(cards,BorderLayout.CENTER);
|
Lógica
Debemos utilizar algún evento para saber en que momento cambiar el panel
que ve el usuario en la ventana.El evento que seleccionamos es el cambio en el
valor del checkBox. Cuando NO está seleccionado el usuario vera el panel
en el cual se le solicita el nombre de usuario y su contraseña y cuando
está seleccionado debe de ver el panel para la solicitud de password.
Para poder reaccionar a cambios en el valor del checkBox debemos "escuchar" los
eventos generados por este. En el caso de nuestro ejemplo, la ventana será
el escucha de estos eventos, por lo que debemos de registrar a la ventana como
oyente del botón.
this.passChck.addActionListener(this);
|
Por lo que en el actionPerformed de la ventana debemos de tener el manejo de
estos eventos.
if(eve.getSource() == this.passChck){
if(this.passChck.isSelected()){
CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, "Panel para la solicitud de clave");
} else {
CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, "Panel con datos de identificacion");
}
}
|
La clave está en el String que se pasa en el método show, observe que se utiliza
la misma cadena que en el método add del panel.
cards.add(panelSolicitaPasswd, "Panel para la solicitud de clave");
cl.show(cards, "Panel para la solicitud de clave");