Como cargar Varios Paneles en Java

Publicado el 17 febrero 2014 por Cristian David Henao Hoyos @chenaooo

Hola, hace rato que no pasaba por aquí con ejemplos simples para compartir, por eso quiero retomar la secuencia de Java Swing con un ejemplo sencillo sobre el trabajo con los JPanel además de vincular otros componentes ya vistos con anterioridad con el fin de simular un Template en nuestra aplicación....
Podemos Simular un Template?
Un template básicamente es como un marco o plantilla con la que vamos a trabajar, de modo que siempre conserve una estructura principal.....por ejemplo, si vamos a hacer una carta, pues lo común es poner en cierta parte la ciudad, fecha, remitente, titulo etc...... partiendo de ahí podemos crear cuantas cartas queramos y todas sin importar el contenido contendrán la misma estructura.....con esto buscamos crear un marco principal donde mostrar diferentes contenidos....

La Aplicación.
La Aplicación es muy simple, como se mencionó vamos a tener un marco que será nuestra ventana principal con un titulo y 3 botones los cuales nunca van a cambiar, a diferencia del contenido central de la ventana que si cambiará dependiendo del botón presionado, cargando simplemente unos paneles de información.........


Y Como lo hacemos?
Ya en otras entradas habíamos trabajado con JPanel y vimos como crearlos facilmente, sin embargo esto lo hacíamos en la misma clase donde lo estábamos utilizando, ahora vamos a crear nuestros paneles independientes en otras clases y los cargaremos en la ventana principal al tratar estas clases Panel como Objetos.......(en esta entrada hicimos algo similar para poner una imagen de fondo redimensionable)......
Para esto usaremos una estructura como se ve en la imagen, aquí en pro de organización vamos a aplicar algunos conceptos del MVC, usando una clase Coordinador que se encargará de las relaciones entre clases (en esta entrada vemos un ejemplo sobre el MVC)...veamos

Aplicacion.javaEsta clase es la encargada del llamado y declaraciòn de objetos, como aplicamos principios del MVC buscamos que existan relaciones entre las clases a trabajar y la clase coordinadora, así que declaramos he instanciamos los objetos necesarios y los enlazamos con el Coordinador.

package principal;
import paneles.PanelIntroduccion;
import paneles.PanelMensaje;
import ventana.VentanaPrincipal;
public class Aplicacion {
public static void main(String[] args) {

//Se declaran los objetos de las clases componentes de aplicación
Coordinador coordinador;
PanelIntroduccion panelIntroduccion;
PanelMensaje panelMensaje;
VentanaPrincipal miVentanaPrincipal;
// Se instancian las clases
coordinador = new Coordinador();
panelIntroduccion = new PanelIntroduccion();
panelMensaje = new PanelMensaje();
miVentanaPrincipal = new VentanaPrincipal();

//Se establece relaciones entre las clases
panelIntroduccion.setCoordinador(coordinador);
panelMensaje.setCoordinador(coordinador);
miVentanaPrincipal.setCoordinador(coordinador);

//Se establece relaciones con la clase coordinador
coordinador.setPanelIntroduccion(panelIntroduccion);
coordinador.setPanelMensaje(panelMensaje);
coordinador.setVentanaPrincipal(miVentanaPrincipal);
miVentanaPrincipal.setVisible(true);
}
}


Coordinador.java

Esta es la clase coordinadora, permite establecer relaciones entre el sistema, será nuestro controlador al aplicar el MVC, esta clase tan solo recibe las instancias definidas en la clase Aplicación para transportar los objetos y llamados entre la aplicación y la ventana....también definimos un método cargarPaneles(int panel); el cual se encarga de retornar el objeto panel que queremos utilizar, al hacer esto nos aseguramos que siempre vamos a trabajar con un único objeto original, evitando crear varios objetos Panel sin necesidad....

import paneles.PanelIntroduccion;
import paneles.PanelMensaje;
import ventana.VentanaPrincipal;
public class Coordinador {
private PanelIntroduccion miPanelIntroduccion;
private PanelMensaje miPanelMensaje;
private VentanaPrincipal miVentanaPrincipal;
public void setPanelIntroduccion(PanelIntroduccion panelIntroduccion) {
miPanelIntroduccion=panelIntroduccion;
}
public void setPanelMensaje(PanelMensaje panelMensaje) {
miPanelMensaje = panelMensaje;
}
public void setVentanaPrincipal(VentanaPrincipal ventana) {
miVentanaPrincipal=ventana;
}
public void cargarPaneles(int panel){
switch (panel)
{
case 1: miVentanaPrincipal.definirPanel(miPanelIntroduccion);
break;
case 2: miVentanaPrincipal.definirPanel(miPanelMensaje);
break;
}
}
}

VentanaPrincipal.javaEsta clase como su nombre lo indica será la ventana principal de la aplicación, en si es la única ventana que nos servirá como marco o plantilla, tendrá un titulo y 3 botones que no cambiarán, lo único que cambiará será su contenido central, este corresponde a un ScrollPanel en el cual dependiendo del botón presionado, alojará un panel u otro de los que vamos a definir.

public class VentanaPrincipal extends JDialog implements ActionListener {
private static final long serialVersionUID = 1L;
JLabel labelTitulo;
public JButton salir;
public JButton botonPanelInicial,botonPanelDos;
public JButton botonInicio;
public javax.swing.JScrollPane scrollPaneles;
Coordinador miCoorDinador;
public VentanaPrincipal() {
initComponents();
setSize ( 693, 518 );
setTitle("Trabajo con Paneles Java Swing");
this.setLocationRelativeTo(null);
setResizable(false);
}
private void initComponents() {
scrollPaneles = new javax.swing.JScrollPane();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
salir=new JButton();
salir.setBounds(610,455,60,30);
salir.setIcon(new ImageIcon(getClass().getResource("/imagenes/salir.gif")));
salir.addActionListener(this);
getContentPane().add(salir);

botonPanelInicial=new JButton();
botonPanelInicial.setText("Panel Inicial");
botonPanelInicial.setBounds(20, 80, 180, 50);
botonPanelInicial.addActionListener(this);
getContentPane().add(botonPanelInicial);

botonPanelDos=new JButton();
botonPanelDos.setText("Panel Secundario");
botonPanelDos.setBounds(220, 80, 180, 50);
botonPanelDos.addActionListener(this);
getContentPane().add(botonPanelDos);

botonInicio=new JButton();
botonInicio.setText("Inicio");
botonInicio.setBounds(780, 80, 180, 50);
botonInicio.addActionListener(this);
getContentPane().add(botonInicio);

/**Propiedades del Label, lo instanciamos, posicionamos y
* activamos los eventos*/
labelTitulo= new JLabel();
labelTitulo.setFont(new java.awt.Font("Tahoma", 0, 28));
labelTitulo.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
labelTitulo.setText("CONTENEDORES JAVA SWING");
labelTitulo.setBorder(javax.swing.BorderFactory.createBevelBorder(
javax.swing.border.BevelBorder.LOWERED));
labelTitulo.setBounds(90, 10, 500, 40);
getContentPane().add(labelTitulo);

scrollPaneles.setAutoscrolls(true);
scrollPaneles.setPreferredSize(new java.awt.Dimension(990, 1915));
scrollPaneles.setWheelScrollingEnabled(false);
getContentPane().add(scrollPaneles);
scrollPaneles.setBounds(20, 150, 650, 300);
pack();
}

/**
* Define el panel introduccion para mostrar en la ventana
* @param introduccion
*/
public void definirPanel(PanelIntroduccion introduccion) {
scrollPaneles.setViewportView(introduccion);
}
/**
* Define el panel Mensaje para mostrar en la ventana
* @param miPanelMensaje
*/
public void definirPanel(PanelMensaje miPanelMensaje) {
scrollPaneles.setViewportView(miPanelMensaje);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==botonPanelInicial){
miCoorDinador.cargarPaneles(1);
}

if (e.getSource()==botonPanelDos){
miCoorDinador.cargarPaneles(2);
}

if (e.getSource()==salir){
int respuesta = JOptionPane.showConfirmDialog(this,
"Esta seguro que desea salir?", "Confirmación",
JOptionPane.YES_NO_OPTION);
if (respuesta == JOptionPane.YES_NO_OPTION){
System.exit(0);
}
}
}
public void setCoordinador(Coordinador coordinador) {
miCoorDinador=coordinador;
}
}

PanelIntroduccion.javaEsta clase corresponde al panel asociado al primer botón de la ventana, tan solo presenta un area de texto y una imagen (que se encuentra alojada en el paquete imagenes).... en ocasiones anteriores trabajabamos los paneles en la misma ventana, ahora vemos que se pueden procesar como objetos, creando clases independientes que extienden de JPanel...el tamaño del panel es superior al contenedor que lo alojará (el JScrollPane) por lo tanto se cargará un scroll para poder ver los componentes del panel

public class PanelIntroduccion extends JPanel {
private static final long serialVersionUID= 1L;
Coordinador miCoorDinador;
private JTextArea areaIntroduccion;
private JLabel titulo, imagen;
private JScrollPane scrollArea;
private JPanel panel;

public PanelIntroduccion() {
initComponents();
setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED,
null, null, null, new java.awt.Color(0, 0, 0)));
setPreferredSize(new Dimension(540, 700));
setLayout(null);
}

private void initComponents() {
panel = new JPanel();
panel.setBounds(10, 11, 600, 810);

imagen = new JLabel();
scrollArea = new JScrollPane();
areaIntroduccion = new JTextArea();
titulo = new JLabel();

titulo.setFont(new java.awt.Font("Verdana", 1, 20));
titulo.setText("Ejemplo CoDejaVu");
panel.add(titulo);
titulo.setBounds(200, 0, 250, 40);
panel.setOpaque(false);
panel.setLayout(null);

String texto="\nEste es un ejemplo del trabajo con paneles en Java Swing, como\n";
texto+="podemos ver se creó un panel en una clase independiente con sus\n";
texto+="propios componentes y este fue cargado en una ventana principal";
areaIntroduccion.setColumns(20);
areaIntroduccion.setEditable(false);
areaIntroduccion.setFont(new java.awt.Font("Verdana", 0, 16));
areaIntroduccion.setLineWrap(true);
areaIntroduccion.setRows(5);
areaIntroduccion.setText(texto);
areaIntroduccion.setWrapStyleWord(true);
areaIntroduccion.setBorder(BorderFactory.createBevelBorder(
javax.swing.border.BevelBorder.LOWERED, null, null, null,
new java.awt.Color(0, 0, 0)));
areaIntroduccion.setCursor(new Cursor(java.awt.Cursor.DEFAULT_CURSOR));
scrollArea.setViewportView(areaIntroduccion);
scrollArea.setBounds(10, 50, 585, 115);

imagen.setHorizontalAlignment(SwingConstants.CENTER);
imagen.setIcon(new ImageIcon(getClass().getResource("/imagenes/java.jpg")));
imagen.setBorder(BorderFactory.createTitledBorder(null, "EJEMPLO 1.",
TitledBorder.LEFT, TitledBorder.TOP,
new java.awt.Font("Verdana", 1, 14)));
imagen.setBounds(120, 200, 410, 412);

panel.add(imagen);
panel.add(scrollArea);
add(panel);
}
public void setCoordinador(Coordinador coordinador) {
miCoorDinador=coordinador;
}
}

PanelMensaje.javaIgual que la anterior, esta clase corresponde a otro panel que queremos cargar al presionar el segundo botón, al hacerlo se oculta el panel que se esté mostrando y se carga el nuevo, corresponde a un panel simple con un area de texto, en este caso el tamaño del panel no requiere que se muestre el scroll de la ventana....

public class PanelMensaje extends JPanel {
private static final long serialVersionUID= 1L;
Coordinador miCoorDinador;
private JTextArea areaIntroduccion;
private JLabel titulo;
private JScrollPane scrollArea;
private JPanel panel;

public PanelMensaje() {

initComponents();

setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED,
null, null, null, new java.awt.Color(0, 0, 0)));
setPreferredSize(new Dimension(540, 250));
setLayout(null);
}

private void initComponents() {
panel = new JPanel();
panel.setBounds(10, 11, 600, 410);
scrollArea = new JScrollPane();
areaIntroduccion = new JTextArea();
titulo = new JLabel();

titulo.setFont(new java.awt.Font("Verdana", 1, 20));
titulo.setText("Sobre CoDejaVu");
panel.add(titulo);
titulo.setBounds(200, 0, 250, 40);
panel.setOpaque(false);
panel.setLayout(null);

String texto="\nSi estas leyendo esto es porque descargaste la aplicación " +
"y porque de una u otra forma te interesó el articulo, si esta " +
"entrada te sirvió y generó esa curiosidad en ti, te invito a compartir " +
"o a dejar tu comentario, ayudando a que este y otros articulos " +
"llegen a mas personas.\n";
texto+="\nSobre El Blog... \n\n" +
"CoDejaVu es un blog personal con el objetivo de compartir conocimiento " +
"y vivencias en torno al desarrollo de Software, todo ha sido con base " +
"en mi experiencia como Ingeniero de Sistemas y Desarrollador, es un espacio " +
"donde se puede brindar ayuda por medio de lecciones aprendidas.";

areaIntroduccion.setColumns(20);
areaIntroduccion.setEditable(false);
areaIntroduccion.setFont(new java.awt.Font("Verdana", 0, 16));
areaIntroduccion.setLineWrap(true);
areaIntroduccion.setRows(5);
areaIntroduccion.setText(texto);
areaIntroduccion.setWrapStyleWord(true);
areaIntroduccion.setBorder(BorderFactory.createBevelBorder(
javax.swing.border.BevelBorder.LOWERED, null,
null, null, new java.awt.Color(0, 0, 0)));
areaIntroduccion.setCursor(new Cursor(java.awt.Cursor.DEFAULT_CURSOR));
scrollArea.setViewportView(areaIntroduccion);
scrollArea.setBounds(10, 50, 585, 210);
panel.add(scrollArea);
add(panel);
}
public void setCoordinador(Coordinador coordinador) {
miCoorDinador=coordinador;
}
}