jueves, septiembre 06, 2007

Ventanas en Java II, Ventanas Internas, Frames Internos: JInternalFrame, JDesktopPane


Para Nai y Eve


Volvamos a repasar unos conceptos básicos sobre las ventanas en java. Tres son los tipos de ventas mas usadas en Java en lo que a Swing respecta.
Los JFrames comunes y corrientes. Que son esas ventas que se van creando en la barra de tareas si usas Windows.

JDialog que son ventanas, por lo general modales, en las cuales debe responder antes de continuar con las otras ventanas. Son ejemplos de dialogos, aquellas ventanas donde se nos solicita insertar la ubicación donde queremos guardar un archivo.
JInternalFrames
: Esta es una clase particular de ventanas. Las cuales se encuentran inmersas en una ventana padre, que hace las veces de escritorio. Actualmente la mayoría de las aplicaciones de escritorio, siguen este formato. Estas ventanas pueden ser minimizadas y expandidas dentro de los límites de la ventana padre.
En este pequeño tutorial veremos las JInternalFrames.

Creando un JInternalFrame

1er Paso: Crear el Frame Padre

El primer paso que debe realizar a la hora de trabajar con InternalFrames es crear la ventana que contendrá los internalFrames. Esta ventana ser padre de todas las demás es decir que el ciclo de vida de todas las ventanas internas se encontrara atada a esta.
Esta ventana padre, será un frame común y corriente.


public class FramePadre extends JFrame implements ActionListener{
JDesktopPane escritorio = new JDesktopPane();// escritorio de Trabajo
JMenuBar barra =new JMenuBar(); // barra de menu
JMenu menu =new JMenu("Archivo");
JMenuItem itemInterna =new JMenuItem("Internal Frame");
JMenuItem itemSalir =new JMenuItem("Salir");
public FramePadre() {
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
……
}
}

Como vemos extiende a JFrame e implementa la interfaz ActionListener, para captar los eventos de una barra de menú que ingresamos. En este tutorial no desarrollaré como crear una barra de menú, pues mi política es encarar cada cosa por separado, mas adelante lo realizare, pero si mostrare el código para poder realizarlo.
Además de ello podemos ver como declaramos una variable escritorio del tipo JDesktopPane, esto nos permitirá asignar una superficie de trabajo que delimitara a los internalFrames.
Dentro del constructor de la clase podemos llamar un método que creamos para ordenar la creación de la interfaz grafica, o directamente poner el siguiente código.

Dimension tamaño =Toolkit.getDefaultToolkit().getScreenSize();//de la pantalla
this.getContentPane().setLayout( null );
this.setBounds(0,0,tamaño.width,tamaño.height-30);
this.setTitle("Ejemplo Escritorio");
this.itemInterna.addActionListener(this);//para captar el evento en el ítem
this.itemSalir.addActionListener(this);//idem anterior
menu.add(this.itemInterna);//la menu le agregamos el item
menu.add(this.itemSalir);// idem anterior
this.barra.add(menu);// a la barra le agregamos el menu
this.setJMenuBar(barra);// al frame le agregamos la barra.
escritorio.setBackground(new Color(251,255,235));// un colorcito p escritorio
this.setContentPane(escritorio);// agregamos el escritorio al frame

Una vez terminado con esto, solo nos resta crear el método para captar los clic que realizara el usuario sobre cada uno de los ítems del menú. Es así como declaramos el método actionPerformed, impuesto por la interfaz ActionListener, e indicamos que realizar ante cada uno de los eventos de usuario.

public void actionPerformed(ActionEvent e){
if(e.getSource()==this.itemSalir){
this.salir();
}
if(e.getSource()==this.itemInterna){
FrameInterno interno =new FrameInterno("Ejemplo Frame Interno");
escritorio.add(interno);// Agregamos el frame al escritorio
try {
interno.setSelected(true);// Decimos que comience Enfocado
} catch (PropertyVetoException e) {}
}
}

Como vemos en el caso de que el usuario haga clic en el menú itemInterna se instancia un internalFrame y luego se lo agrega al escritorio. Finalmente decimos que se inicialice enfocado y capturamos la excepción.

2do Paso Crear un Internal Frame

Para crear nuestro frame interno, tenemos que crear una clase que herede de javax.swing.JInternalFrame:


public class FrameInterno extends JInternalFrame implements ActionListener{
…//components Swing, botones, label etc
public FrameInterno(String titulo) {
super(titulo,
true, //redimencionar
true, //cerrar
true,//maximizar
true);//minimizar
try{
interfazGrafica();
this.setVisible(true);
}
catch(Exception e){}
}
}
Como vemos podemos definir los botones que contendrá el frame en el ángulo superior derecho. Esto lo definimos pasándole como argumentos a la súper clase valores boléanos si queremos permitir eso.

Luego en el metodo interfazGrafica(), escribimos toda la interfaz que podría ser:


private void interfazGrafica() throws Exception {
this.getContentPane().setLayout(null);
this.setSize(new Dimension(311, 347));
btn_cerrar.setText("Cerrar");
btn_cerrar.setBounds(new Rectangle(180, 270, 110, 30));
jLabel1.setText("Este es Un Frame Interno");
jLabel1.setBounds(new Rectangle(30, 65, 255, 35));
jLabel1.setFont(new Font("Dialog", 1, 20));
jLabel1.setForeground(Color.blue);
this.btn_cerrar.addActionListener(this);
this.getContentPane().add(jLabel1, null);
this.getContentPane().add(btn_cerrar, null);
}

Y finalmente tenemos que hacer visible el frame con setVisible
Por ultimo debemos definir el método al cual nos obliga la interfaz ActionListener

public void actionPerformed(ActionEvent e){
if(e.getSource()==this.btn_cerrar){
this.setVisible(false);
}
}

Con esto ya tenemos un frame básico a partir del cual podemos empezar a jugar y agregarle componentes como botones y label o cualquier otra cosa que se les ocurra.
No dejen de ver que bueno que queda cuando minimizan un internalFrame!!

Saludos

5 comentarios:

Anónimo dijo...

Hola, buen tutorial...
He realizado los InternalFrame de la misma manera que usted la explica, sin embargo tengo un problemita adicional.
Al momento de colocarle un JLabel en el Frame Padre para colocar una Imagen el JInternalFrame se coloca detras del JLabel.
Al igual Cuando ya agrego por primera vez un JInternalFrame al llamar al proximo este tambien se coloca detras del que llame primero.

Me gustaria saber cual seria la solucion para anteponer el JInternalFrame del JLabel y del otro JInternalFrame
Le agradesco

Anónimo dijo...

Hola, buen tutorial...
He realizado los InternalFrame de la misma manera que usted la explica, sin embargo tengo un problemita adicional.
Al momento de colocarle un JLabel en el Frame Padre para colocar una Imagen el JInternalFrame se coloca detras del JLabel.
Al igual Cuando ya agrego por primera vez un JInternalFrame al llamar al proximo este tambien se coloca detras del que llame primero.

Me gustaria saber cual seria la solucion para anteponer el JInternalFrame del JLabel y del otro JInternalFrame
Le agradesco

Anónimo dijo...

Antes que nada Gracias!!!!
Me ayudo demaciaciado el tutorial, me agrado mucho que no hayas borrado nada del codigo o lo dejaras incompleto sin ser funcionable.

de nuevo gracias...

Cristian met dijo...

Muchas gracias brother, espero que sigas subiendo mas tutoriales

aro dijo...

Anonimo, por lo que me dices, parecería ser una problema de layout, pero la verdad tendria que ver primero lo que tienes.
Anonimo 2: thx
Cristian met: d nada bro y voy a tratar de subir algunas cositas mas que puedan ser interesantes. Lamentablemete estoy sin tiempo para esto que me gusta mucho. Maldita vida de adultos y las facturas por pagar jeje :)