lunes, 18 de junio de 2012

Ventanas internas - JInternalFrame

Algo muy util en cualquier aplicacion, es poder tener dos o mas ventanas internas abiertas al mismo tiempo, puesto que nos permite por ejemplo: estar ingresando datos, mientras consultamos un listado, o dejar corriendo un proceso al mismo instante que consultamos otra cosa.
Swing nos permite hacer esto, mediante el uso de JInternalFrame y el uso de JDesktopPane para administrarlas.
Al principio puede parecer bastante complicado, pero como todo, luego de trabajar un poco y crear algunas ventanas internas se vuelve simple. En mi experiencia, resulta mas sencillo de trabajar si tenemos una clase que es la ventana principal, y en otras clases que extienden de JInternalFrame las ventanas internas.
Primero creamos la clase de la ventana principal:


public class VentanaPrincipal extends JFrame implements ActionListener {

  /*
   * Definimos el escritorio
   */
  private JDesktopPane desktop;


  public VentanaPrincipal() {
    //Titulo de la ventana
    setTitle("Ejemplo ventanas internas - Ventana Principal");
    
    //Instanciamos el escritorio
    desktop = new JDesktopPane();
    desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);


    //Creamos un panel
    JPanel panel = new JPanel(new BorderLayout());
    //Agregamos al panel el escritorio
    panel.add(desktop,BorderLayout.CENTER);   
    
    //El contenido de la ventana sera el panel que creamos anteriormente.
    setContentPane(panel);
    
    setSize(800,600);
    
    setVisible(true);
    
  
    agregarVentanaEjemplo();
  }


}


Noten que esta faltando un método llamado agregarVentanaEjemplo(), en este método esta el código para lanzar la ventana interna, instanciarla y mostrarla en pantalla. Normalmente, o en el común de las aplicaciones (siempre hay una excepción a la regla) esta acción se va a hacer desde un menú o desde un barra de herramientas. A los fines del ejemplo, lo haremos de esta forma.



  private void agregarVentanaEjemplo() {
    
      EjemploInternalFrame frame = new EjemploInternalFrame();


      desktop.add(frame);
      
      try {
        frame.setSelected(true);
      } catch (java.beans.PropertyVetoException e1) { 
        e1.getMessage(); 
      }
  }



Luego debemos definir la clase EjemploInternalFrame, que es la clase que construirá la ventana interna con los componentes que sean necesarios para cada caso, para el caso del ejemplo, cree un pequeño formulario (muy pequeño a decir verdad).



public class EjemploInternalFrame extends JInternalFrame {
    
  /**
   * Constructor
   */
  public EjemploInternalFrame() {
    super("Ejemplo Internal Frame",
          true, //resizable
          true, //closable
          true, //maximizable
          true);//iconifiable
          
    getContentPane().add(contenido(),BorderLayout.CENTER);
    pack();  
    setVisible(true);          
  }


  private JPanel contenido() {
    JPanel panel = new JPanel(new GridLayout(2,2));
    
    JLabel l1 = new JLabel("Leyenda");
    JLabel l2 = new JLabel("Leyenda");
    
    JTextField txt1 = new JTextField("");
    JTextField txt2 = new JTextField("");
    
    panel.add(l1);
    panel.add(txt1);
    
    panel.add(l2);
    panel.add(txt2);
    
    return panel;
  }
  
}




Finalmente aquí tienen una captura de pantalla de como se ve esto funcionando:



El código del ejemplo esta para descargarlo acá.






No hay comentarios:

Publicar un comentario