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.
Recibe notificaciones por correo