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");