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

lunes, septiembre 03, 2007

Confirmación y Alertas en Java: JOptioPane, showMessageDialog, showConfirmDialog, showInputDialog , showOptionDialog

La clase JOptionPane es una clase que hereda de JComponent. Ésta clase nos permitirá crear alertas o cuadros de diálogos simples para poder solicitar, o mostrar, información al usuario.
Los métodos que revisaremos en este pequeño tutorías serán:

  1. JOptionPane.showMessageDialog(…)
  2. JOptionPane.showConfirmDialog(….);
  3. JOptionPane.showInputDialog(…);
  4. JOptionPane.showOptionDialog(…);

Cada uno de estos métodos presenta una particularidad distinta pero todos ellos nos muestran una ventanita pop up que nos permitirá captar información del usuario.

  1. showMessageDialog

JOptionPane. showMessageDialog (Component componentePadre, Object mensaje, String titulo, int tipoDeMensaje)

Nos sirve para mostrar información, por ejemplo alguna alerta que queremos hacerle al usuario. Veamos cuales son los principales argumentos del método.
componentePadre: es por el ejemplo el Frame desde el cual lo llamamos. Si queremos lo podemos poner en null, que es mas o menos lo mismo.
Mensaje: es lo que queremos que diga el cuadro de dialogo.
Titulo: el titulo.
tipoDeMensaje: son constantes que le dirán a java que tipo de mensaje queremos mostrar. De acuerdo a esto seran los iconos que se mostraran en el cuadro de dialogo. Las opciones son

  • ERROR_MESSAGE
  • INFORMATION_MESSAGE
  • WARNING_MESSAGE
  • QUESTION_MESSAGE
  • PLAIN_MESSAGE

Si quisiéramos mostrar un icono personalizado, podemos agregarlo al final como un argumento más.
Ejemplo:

JOptionPane.showMessageDialog(null,"Acceso Denegado","Error",
JOptionPane.ERROR_MESSAGE);

  1. showConfirmDialog

Éste método sirve para pedirle al usuario una confirmación. Por ejemplo una confirmación de salida del sistema

Int respuesta =JOptionPane. showMessageDialog (Component componentePadre, Object mensaje, String titulo, int tipoDeOpcion);

El anterior es la versión corta del los argumentos del método. La versión larga incluye el tipo de mensaje y el icono, por si queremos personalizarlo.
Los argumentos son idénticos a los del método anterior. Excepto por el tipo de opción, que es otra constante y los valores pueden ser:

  • DEFAULT_OPTION
  • YES_NO_OPTION
  • YES_NO_CANCEL_OPTION
  • OK_CANCEL_OPTION

Como vemos el método devuelve una un entero que nos permitirá captar cual es la opción elegida por el usuario. Los valores serán 0 para Si, 1 para No, 2 para Cancelar y -1 para el cierre de la ventana. Así podremos preguntar cual es el valor devuelto y realizar la acción que deseamos.
Ejemplo

int i =JOptionPane.showConfirmDialog(this,"¿Realmente Desea Salir de Hola Swing?","Confirmar Salida",JOptionPane.YES_NO_OPTION);
if(i= =0){
System.exit(0);
}

  1. ShowInputDialog

Este método nos muestra una ventana donde podremos insertar una String. Por ejemplo cuando queremos que el usuario inserte su nombre. La versión corta del método es

String respuesta = JOptionPane.showInputDialog(Object mensaje)

Este método devolverá una String para poderla utilizar después. La versión larga de los argumentos del método es similar a los anteriores.
Ejemplo:

String nombre =JOptionPane.showInputDialog("Inserte su Nombre");
this.lbl_nombre.setText(nombre);

También podemos crear un cuadro de dialogo que contenga un combo con las opciones predeterminadas que le queremos dar al usuario.
Ejem:

Object[] valoresPocibles = {"Pedro", "Juan", "Carlos" };
Object jefe = JOptionPane.showInputDialog(null,
"Seleccione cual es su Jefe Inmediato", "Seleccionar Jefe",
JOptionPane. QUESTION_MESSAGE, null,
valoresPocibles,
valoresPocibles[0]);
this.lbl_jefe.setText((String)jefe);

El array de valores posibles nos muestra en un combo cuales serán los jefes que podemos mostrar. El último argumento del método nos muestra cual será la opción seleccionada por defecto

showOptionDialog

Con este método podemos crear cuadros de diálogos con botones personalizados. Esta bueno para darle un toque personal a los cuadros de dialogo
El método tiene la forma:

Int res = JOptionPane.showOptionDialog(Component componentePadre, Object mensaje, String titulo, int tipoDeOpcion, int tipoMensaje, Icon icono, Object[] botones, Object botonDefault)

Aquí lo único que varia con el resto es el array de botones que vamos a tener, debemos destacar que no hace falta que creemos botones, solo tenemos que poner cual será el texto que saldrá en el.

Object[] botones = {"Si dale va a estar bueno", "No?... buuu" };
int i=JOptionPane.showOptionDialog(null, "¿Queres salir a Bailar esta Noche?", "Sita",
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,null, botones, botones[0]);
System.out.println(i);

Después podemos tomar la respuesta como lo hacíamos con el confirmDialog.
Bueno hasta la próxima, esto es lo más importante en los mensajes o alertas.