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
1 Comentarios:
Escribir ComentarioGrandioso aporte es lo que estaba buscando man!!
ResponderLamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.
Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión