Ocultar contenido

   Hace algún tiempo me preguntaron como implementar listeners y todo eso de forma mas sencilla y práctica, también me preguntaron como ocultar el contenido de un panel y mostrarlo en en frame principal. Bueno, hoy aprovechare este post para explicar todo eso.

   Primero podemos declarar las listeners, botones, paneles o lo que vayamos a utilizar de forma global y luego cargarlos para definirlos en la clase principal. Para crear un efecto de Expandir/Contraer debemos obtener el tamaño del panel para restaurarlo al momento de contraer, así que primero va el ejemplo y luego la explicación:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JOptionPane;

public class OcultarContenido extends JFrame {
  Container cp;
  boolean cambios = false;
  JButton MostrarOcultar;
  JPanel PANEL;
  ActionListener expandir;
  ActionListener contraer;

  public OcultarContenido() {
 super("Ocultar Contenido");
 PanelOculto PaneldeBotones = new PanelOculto();
    PaneldeBotones.add(MostrarOcultar = new JButton("Mostrar Contenido"));
    MostrarOcultar.addActionListener(expandir);
    add(BorderLayout.NORTH, PaneldeBotones);

    contraer = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        remove(PANEL);
        pack();
        MostrarOcultar.setText("Mostrar Contenido");
        MostrarOcultar.removeActionListener(contraer);
        MostrarOcultar.addActionListener(expandir);
      }
    };
    expandir = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        add(BorderLayout.SOUTH, PANEL);
        pack();
        MostrarOcultar.setText("Ocultar Contenido");
        MostrarOcultar.removeActionListener(expandir);
        MostrarOcultar.addActionListener(contraer);
      }
    };
    PANEL = new Opciones();
    MostrarOcultar.addActionListener(expandir);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setVisible(true);
  }

  class Opciones extends JPanel {
    Opciones() {
      add(new JCheckBox("JCheckBox1"));
      add(new JCheckBox("JCheckBox2"));
      add(new JCheckBox("JCheckBox3"));
    }
  }

  class PanelOculto extends JPanel {
    public Dimension getPreferredSize() {
      int dHeight = MostrarOcultar.getPreferredSize().height + 5 + 5;
      int dWidth = PANEL.getPreferredSize().width;
      return new Dimension(dWidth, dHeight);
    }
  }

  public static void main(String[] av) {
 JOptionPane.showMessageDialog(null,"Ocultar Contenido...\n");
    JOptionPane.showMessageDialog(null,"By Carlitox ("+
   "http://calitoxenlaweb.blogspot.com)");
    new OcultarContenido();
  }
}

   Bien, tenemos los listeners declarados de forma global, por lo que los definimos de la siguiente manera
ActionListener expandir;

    expandir = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        add(BorderLayout.SOUTH, PANEL);
        pack();
        MostrarOcultar.setText("Ocultar Contenido");
        MostrarOcultar.removeActionListener(expandir);
        MostrarOcultar.addActionListener(contraer);
      }
    };

   Una vez definido el listener (acciones que hará) lo cargamos al componente (asignamos el listener)
//Se declara y agrega el boton
PaneldeBotones.add(MostrarOcultar = new JButton("Mostrar Contenido"));

//Se asigna el listener
MostrarOcultar.addActionListener(expandir);

   Es indiferente como se creen, aunque a mi siempre me ha gustado hacerlo de forma directa esta es la mas estructurada y de esta forma es más práctico y sencillo estudiar el código fuente. Tambien tenemos la clase "Opciones" que es un panel oculto que contiene los checkbox que he definido.
class Opciones extends JPanel {
    Opciones() {
      add(new JCheckBox("JCheckBox1"));
      add(new JCheckBox("JCheckBox2"));
      add(new JCheckBox("JCheckBox3"));
    }
  }

   Lo importante de esta clase es ver el extends, por lo que lo instancio y cargo al método principal para agregarlo al frame
PANEL = new Opciones();

   Ahora solo falta definir el panel oculto
class PanelOculto extends JPanel {
    public Dimension getPreferredSize() {
      int dHeight = MostrarOcultar.getPreferredSize().height + 5 + 5;
      int dWidth = PANEL.getPreferredSize().width;
      return new Dimension(dWidth, dHeight);
    }
  }

   dHeight es para obtener el alto del botón, le sumamos 10 (5+5) para crear el efecto de expandir y contraer.
   dWidth es para el obtener el ancho pero del frame principal.

   Ya por últimos retornamos la nueva dimensión, esto solo se ejecuta para definir el tamaño del panel y crear un efecto limpio, en todo caso hace referencia al frame principal.