lunes, 17 de febrero de 2014

Como cargar Varios Paneles en Java

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.java

Esta 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.java

Esta 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.java

Esta 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.java

Igual 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;
 }
}


Y Listo!!! la aplicación nos permitirá tener cualquier cantidad de paneles con sus propios componentes y procesarlos facilmente de forma independiente, gracias al JScrollPane de la ventana principal se podrán cargar en esta misma simulando una plantilla o Marco general para nuestros contenidos......


Descarga.

Como es costumbre en el enlace de descarga se encuentra el archivo .rar con la aplicación, solo es cuestión de descomprimir y abrir con Eclipse y listo.......si usas NetBeans te interesará esta entrada con un vídeo paso a paso de como abrirlo en el......... recuerden que es gratis, nada cuesta opinar, compartir o agradecer :) 




También te podría Interesar.


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó...... te invito a compartir
 y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)

9 comentarios:

  1. Muy bueno, Cristian, hay pocos ejemplos en la red sobre java swing, o por lo menos yo no los encuentro :)
    Gracias, y saludos

    ResponderEliminar
    Respuestas
    1. Con gusto Julio, si toca buscar mucho para encontrar buenos artículos :S ..... gracias por comentar ;)

      Eliminar
    2. Hola Cristian, gracias por tu aaporte ha sido increible, pero quisiera ver si me puedes ayduar, quiero que los paneles se reincien a su estado inicial, por ejemplo si al panl introduccion le modifico el texto y luego cambio de panel y regreso al de introudcción, el panel se queda con la modificación y lo que yo deseo es que elimine eso y regrese a su estado orginal, ojala pudieras ayurdarme.

      Eliminar
  2. Gracias por compartir tus conocimientos son pocos los que lo hacen ^^ , la gran mayoria de tus aportes me han salvado la vida ^^,

    ResponderEliminar
  3. Ahhh, y como haces para que el código salga con color?

    ResponderEliminar
  4. Que buenos aportes, tus post son precisamente lo que busco horas y horas en la red y no encuentro ,Muchas graciaaas. (:

    ResponderEliminar
  5. Que bueno que te vi, estaba con un problema así en mi aplicación pero despues
    de ver esto toca digerirlo y ver si lo puedo hacer,

    ResponderEliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar

Eres libre de realizar cualquier comentario, desde que pueda ayudar con gusto lo atenderé, y si es un critica, bienvenida sea!!!