domingo, 18 de agosto de 2013

JFrame y JDialog

Para dar inicio a el primer articulo sobre componentes Java Swing, vamos a trabajar con la base de toda interfaz gráfica........ Las Ventanas. 
En esta entrada veremos simplemente como construir ventanas usando los componentes JFrame y JDialog, conoceremos en términos generales en que se diferencian y cual es la forma de crearlos....

Tal como se mencionó en la entrada anterior, cuando vamos a construir aplicaciones con Java Swing debemos tener al menos un contenedor, este sera el tapiz donde pintaremos el conjunto de componentes que arman las interfaces, para eso podemos usar un JFrame o un JDialog (Aunque también se pueden usar Applets).

JFrame o JDialog?

Estos componentes hacen parte del paquete javax.swing, básicamente nos permiten crear Ventanas para nuestras aplicaciones y en ellas alojar otros componentes para darle cuerpo a la interfaz de usuario, en si tienen comportamientos similares y a simple vista pueden parecer iguales, pero son componentes distintos.

Un JFrame permite crear una ventana con ciertas características, por ejemplo podemos visualizarla en nuestra barra de tareas, caso contrario de los JDialog, ya que estos últimos son Ventanas de Dialogo con un comportamiento diferente, no se puede ver la ventana en la barra de tareas ni posee los botones comunes de maximizar o minimizar....

Los JDialog pueden ser hijos de JFrames o de otros JDialog mientras que los JFrame no (Como así Hijos?), es decir, si tenemos claros conceptos de programación Orientada a Objetos podemos relacionar esto de Hijos con el concepto de Herencia (Aunque no directamente, es mas a nivel conceptual), con estos componentes podemos hacer que una Ventana sea Padre de otra Ventana de tipo JDialog, asignándole algún tipo de comportamiento o dejando la ventana padre como Principal.

Es recomendable cuando trabajemos con GUI's crear un único JFrame para toda la aplicación y el resto de ventanas podemos trabajarlas como JDialog ya que de esa manera evitamos que se creen varias ventanas independientes y en vez de eso otras dependientes de la principal.

Podemos encontrar muchas consideraciones sobre estos componentes pero lo anterior es básicamente lo que necesitamos saber en términos generales.............veamos su implementación.


JFrame.

Como se mencionó anteriormente debemos tener un contenedor, para esto podemos utilizar la clase Container, esta será la encargada de "alojar" los componentes que queremos mostrar en la ventana (botones, labels, cajas de texto etc...), digo que "podemos" ya que nada nos impide alojar los componentes directamente en el frame sin necesidad de usar el Container, sin embargo se recomienda el uso de este elemento para aprovechar las propiedades y métodos que nos puede brindar, y no dejar simplemente nuestros componentes regados....

Creamos la clase VentanaPrincipal, esta Hereda de JFrame, posteriormente declaramos el Objeto Contenedor y luego lo instanciamos mediante el método getContentPane();

public class ClaseFrame extends JFrame 
{
  private Container contenedor;

    public VentanaPrincipal()//constructor
    {
 contenedor=getContentPane();
 contenedor.setLayout(null);
        //Asigna un titulo a la barra de titulo
 setTitle("CoDejaVu : Titulo De La ventana");
 //tamaño de la ventana
 setSize(400,200);
 //pone la ventana en el Centro de la pantalla
 setLocationRelativeTo(null);
    }
}

La clase anterior crea una Ventana Vacía, es importante tener muy claro que JFrame también es una clase de la cual se debe heredar para crear nuestras ventanas......

JDialog.

Un JDialog se construye de la misma manera que un JFrame la única diferencia es que hereda de la Clase JDialog...... como se mencionó anteriormente básicamente son ventanas pero tienen ciertas diferencias, la mas notoria es que no posee los botones básicos de las ventanas ni pueden ser visualizados en la barra de tareas...
public class VentanaConfirmacion extends JDialog
{
 private Container contenedor;
 
 public VentanaConfirmacion(){
  contenedor=getContentPane();
  contenedor.setLayout(null);
  //Asigna un titulo a la barra de titulo
  setTitle("CoDejaVu : Titulo Del JDialog");
  //tamaño de la ventana
  setSize(300,200);
  //pone la ventana en el Centro de la pantalla
  setLocationRelativeTo(null);
 }
}

Igual que El anterior, este código crea una ventana de dialogo Vacía, se llaman de dialogo por las características mencionadas que la diferencian de una ventana normal.

Conclusiones.

Si ejecutamos las 2 clases veremos estas diferencias.

Como vemos lo principal en estos momentos es que la ventana que hereda de JFrame tiene los botones básicos de toda ventana, a demás permite su visualización en la barra de tareas, mientras que la ventana que hereda de JDialog no posee estas características.

Y Listo!!!, la intención de esta entrada es Mostrar lo que necesitamos saber sobre estos componentes, en un próximo articulo veremos un ejemplo simple del como usarlos, donde las diferencias mencionadas serán mas notorias ;)




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 ;)

16 comentarios:

  1. Buenas tardes sigo sin entender este concepto de "Los JDialog pueden ser hijos de JFrames o de otros JDialog mientras que los JFrame no (Como así Hijos?), es decir, si tenemos claros conceptos de programación Orientada a Objetos podemos relacionar esto de Hijos con el concepto de Herencia" Podria colocar un ejemplo que muestre que de los jframe no se pueden ser hijos. Gracias

    ResponderEliminar
    Respuestas
    1. Hola Juan, como indiqué me refiero mas a nivel conceptual, ya que si tenemos un JFrame, podemos pasárselo por referencia al constructor del JDialog:

      VentanaJDialog miVentanaJDialog=new VentanaJDialog(miVentanaJFrame,true);

      y de esta manera decimos que el JDialog es Hijo del JFrame, pues depende de este, revisa esta entrada, ahí explico mejor el concepto, si te das cuenta, el JFrame se inhabilita porque el JDialog está activo....
      http://codejavu.blogspot.com/2013/08/ejemplo-ventanas-en-java.html

      Como te dije, es a nivel conceptual......

      Eliminar
  2. Tengo una interogante como podria saber si un JFRAME ya existe para no abrir o otro y si existe este aparesca si esta minimizado

    ResponderEliminar
    Respuestas
    1. Hola, podrias trabajar con un unico objeto del tipo JFrame que supongo es la ventana que quieres, y así no lo instanciarias mas de una vez, para eso puedes aplicar el patrón Singleton, te dejo un enlace que te puede servir ;)
      http://codejavu.blogspot.com/2013/07/ejemplo-patron-singleton.html

      Eliminar
  3. Hola, al decir que el debe de haber un jFrame por aplicación, entonces este debería de ser el menú principal de la la aplicación.

    ResponderEliminar
    Respuestas
    1. Hola, si podria ser la ventana principal donde estén todas las opciones... te invito a ver la entrada sobre contenedores Java Swing, un saludo.

      Eliminar
  4. Hola Cristian,
    Gracias por el tutorial, te dejo una consulta, tengo un código donde instancio un jFrame a partir de un String que recibo con el nombre, al querer hacer lo mismo pero instanciando un jdialog no logro hacerlo me podrias ayudar (donde miOpcionMenu tiene un String "paquete.clase"
    Class miClase = Class.forName(miOpcionMenu);
    miJframe = miClase.newInstance();

    //para hacerla visible
    miSetVisible = miClase.getMethod("setVisible", boolean.class);
    miSetVisible.setAccessible(true);
    miSetVisible.invoke(miJframe, (Object) true); //accedo al metodo set visible

    ResponderEliminar
  5. Hola una consulta , es decir que solo hay que utilizar un jframe para la ventana principal y lo demas con jdialog ? y si quiero por ejemplo en un sistema que la ventana de facturación se pueda cambiar el tamaño ahi si puedo utilizar otra jframe ?

    ResponderEliminar
    Respuestas
    1. Hola Fernando, no necesariamente, en otra entrada del blog puedes encontrar diferentes ejemplos de contenedores, si quieres puedes trabajar solo con JFrame's o si quieres con JInternalFrame, hay varias alternativas todo depende de tus gustos o la necesidad que tengas.

      Eliminar
  6. Hola, quisiera saber cómo se le ponen botones, textField, jLabels, etc en un jDialog?

    ResponderEliminar
  7. Hola Amigo, como puedo realizar esto.

    Crear un diálogo con uno o varios botones,
    mejor sin el JLabel, que este me puede dar problemas cuando vaya a
    insertar el diálogo sin botones pero con algún widget (JLabel,
    JTextField...).
    Crear dialogo sin botones pero con widget.Lo de sin botones significa eso, que no tenga botones,esto porque si empezamos a insertar diálogos con botones de OK y Cancel unos dentro de otros el usuario se liaría sobre qué está aceptando o
    cancelando al pulsar cada botón y lo que quiero es que el diálogo
    final sólo tenga un OK y un Cancel para que se tenga una transacción
    atómica. Los diálogos podría tener otros botones que no sean para
    aceptar o cancelar.
    Crear desde la paleta un nuevo diálogo con las características
    que te comento y ver la manera de escribir un código que inserte el
    segundo diálogo en el primero respetando los layouts. Esto último
    significa por ejemplo que si los botones del primero están en la parte
    de abajo de la ventana, al insertar el segundo sigan estando ahí.


    Gracias

    ResponderEliminar
  8. Bueno por lo que veo tu blog esta inactivo hace meses pero queria hacer notar un error en el codigo (supongo, si tiene alguna explicacion no lo se)

    El tema es que el constructor de la clase "ClaseFrame" se deberia llamar igual a la clase y no "VentanaPrincipal", el codigo tal como esta ahi da un error de compilacion.

    un saludo (:

    ResponderEliminar
  9. No sé si sea error, pero... ¿no falta un setVisible(true); en la VentanaPrincipal? Saludos!

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

    ResponderEliminar
  11. Increíble lo bien explicada que está cada entrada de este Blog!
    Ya me suscribí !!!
    Saludos

    ResponderEliminar

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