domingo, 25 de agosto de 2013

Ejemplo Ventanas en Java

En la entrada anterior conocimos a nivel general algunas características de los componentes JFrame y JDialog, vimos a groso modo lo principal para poder trabajar con ellos..

En esta entrada aplicando los conceptos vistos, vamos a hacer un pequeño ejemplo usando estos componentes para crear 2 ventanas y relacionarlas entre ellas.

El Ejemplo.

Este ejemplo será muy básico, simplemente vamos a crear 2 ventanas  y mediante un botón estableceremos comunicación entre ellas, tendremos la VentanaPrincipal que será un JFrame y la VentanaConfirmacion que será un JDialog...  

Vamos a ver de forma simple como relacionar estas ventanas, pero para eso necesitamos como mínimo un botón que permita establecer el evento de llamado.

Sabemos que una ventana agrupa una serie de componentes (botones, etiquetas de texto, cajas de texto, combos, Paneles y por su puesto un Frame ) no vamos a profundizar en cada uno, por el momento debemos saber que estos y en general cualquier componente es una Clase Java y al usarlas lo que hacemos es crear objetos de esa clase para aprovechar su funcionalidad...

para este ejemplo además del JFrame vamos a utilizar un JButton y un JLabel, veamos.

JButton.

Esta es la clase que permite crear botones simples como todos los conocemos, sabemos que un botón es un componente en el cual al hacer click ejecutamos cierta acción (mas adelante veremos una entrada sobre estos y sus principales eventos)...

Para crear un botón debemos tener en cuenta una serie de pasos, inicialmente instanciamos la clase JButton creando un objeto botón al que posteriormente le asignaremos las características de tamaño, texto, ubicación y acciones a realizar.

JLabel.

Un JLabel básicamente es la clase que nos permite agregar etiquetas de texto en nuestra ventana, sin embargo podemos manipular el objeto que creemos para que muestre imagenes o iconos que le den mejor apariencia a nuestra aplicación...... igual que un JButton, simplemente debemos crear un objeto de JLabel y asignarle las propiedades requeridas....

La Aplicación.

Como lo mencionamos, el ejemplo se divide en 3 clases, la Clase VentanaPrincipal que corresponde a un JFrame, la Clase VentanaConfirmacion que es un formulario y la clase Principal que contiene el método main para iniciar el sistema.


VentanaPrincipal 

Esta ventana será el lugar donde llamamos la ventana de confirmación, aquí crearemos un contenedor donde se agregará una etiqueta de texto y un botón para generar el evento.
public class VentanaPrincipal extends JFrame implements ActionListener {

private Container contenedor;/**declaramos el contenedor*/
JButton botonCambiar;/**declaramos el objeto Boton*/
JLabel labelTitulo;/**declaramos el objeto Label*/
private VentanaPrincipal miVentanaPrincipal;

public VentanaPrincipal(){
  /**permite iniciar las propiedades de los componentes*/
  iniciarComponentes();
  /**Asigna un titulo a la barra de titulo*/
  setTitle("CoDejaVu : JFrame VentanaPrincipal");
  /**tamaño de la ventana*/
  setSize(300,180);
  /**pone la ventana en el Centro de la pantalla*/
  setLocationRelativeTo(null);
}

/**
 * @param miVentana
 * Enviamos una instancia de la ventana principal
 */
public void setVentanaPrincipal(VentanaPrincipal miVentana) {
   miVentanaPrincipal=miVentana;
}

private void iniciarComponentes() {
  contenedor=getContentPane();/**instanciamos el contenedor*/
  /**con esto definmos nosotros mismos los tamaños y posicion
   * de los componentes*/
  contenedor.setLayout(null);
 
  /**Propiedades del boton, lo instanciamos, posicionamos y
   * activamos los eventos*/
  botonCambiar= new JButton();
  botonCambiar.setText("Iniciar");
  botonCambiar.setBounds(100, 80, 80, 23);
  botonCambiar.addActionListener(this);
 
  /**Propiedades del Label, lo instanciamos, posicionamos y
   * activamos los eventos*/
  labelTitulo= new JLabel();
  labelTitulo.setText("VENTANA PRINCIPAL");
  labelTitulo.setBounds(80, 20, 180, 23);
  
  /**Agregamos los componentes al Contenedor*/
  contenedor.add(labelTitulo);
  contenedor.add(botonCambiar);
 }
  /**Agregamos el evento al momento de llamar la otra ventana*/
  @Override
  public void actionPerformed(ActionEvent evento) {
      if (evento.getSource()==botonCambiar)
 {
          /*enviamos la instancia de la ventana principal para que
          * esta sea Padre de la ventana de dialogo*/
   VentanaConfirmacion miVentanaConfirmacion=new VentanaConfirmacion(miVentanaPrincipal,true);
   miVentanaConfirmacion.setVisible(true);
 }
    }
}

Como vemos se establecen las propiedades para cada componente agregado, además se implementó la interface ActionListener, esto con el fin de utilizar el método actionPerformed() el cual permite establecer la lógica para los eventos del botón en este caso..... hay que tener en cuenta que para que los eventos funcionen se debe asignar la propiedad addActionListener.... 

también cabe resaltar que se envío una instancia de la VentanaPrincipal a la VentanaConfirmacion esto con el fin de que el JDialog sea hijo del JFrame (concepto del que hablamos en la entrada anterior), mas adelante evidenciaremos el porqué....

VentanaConfirmacion.

la VentanaConfirmacion tan solo la crearemos para diferenciar nuestra ventana de Dialogo de nuestra ventana principal, extiende de JDialog y solo va a tener un JLabel con el titulo de la ventana.....como se menciona en el punto anterior, vamos a hacer que sea hija del JFrame, de esta manera evitamos que se creen muchos objetos miVentanaConfirmacion, sino, solo uno dependiente de la principal...
public class VentanaConfirmacion extends JDialog{
private Container contenedor;
JLabel labelTitulo;
 
public VentanaConfirmacion(VentanaPrincipal miVentanaPrincipal, boolean modal){
 /**Al llamar al constructor super(), le enviamos el
  * JFrame Padre y la propiedad booleana que determina
  * que es hija*/
  super(miVentanaPrincipal, modal);
  contenedor=getContentPane();
  contenedor.setLayout(null);
  //Asigna un titulo a la barra de titulo
  setTitle("CoDejaVu : JDialog VentanaConfirmacion");
  
  labelTitulo= new JLabel();
  labelTitulo.setText("VENTANA DE CONFIRMACION");
  labelTitulo.setBounds(20, 20, 180, 23);

  contenedor.add(labelTitulo);
  //tamaño de la ventana
  setSize(350,150);
  //pone la ventana en el Centro de la pantalla
  setLocationRelativeTo(null);
 }
}

Como vemos el constructor trae 2 parámetros, el Frame padre y la propiedad que determina si es hija o no, con esto vamos a evitar que el usuario ingrese a la ventanaPrincipal y trabaje en ella, bloqueándola solo hasta que se cierre la ventana de dialogo...

Principal.

Como en casi todos los ejemplos, tenemos una clase Principal donde inicia todo el proceso, esta clase contiene el método main que contiene la lógica para la creación y cargue de la ventana principal...... como vemos creamos una instancia de la VentanaPrincipal y la enviamos como parámetro, esto para trabajar siempre con la ventanaPrincipal y no crear muchas instancias de la misma, sino trabajar siempre con la original.... esto también podríamos realizarlo aplicando el patrón Singleton trabajado en entradas anteriores...
public class Principal {

public static void main(String[] args) {
/**Declaramos el objeto*/
 VentanaPrincipal miVentanaPrincipal;
 /**Instanciamos el objeto*/
 miVentanaPrincipal= new VentanaPrincipal();
 /**Enviamos el objeto como parametro para que sea unico
  * en toda la aplicación*/
  miVentanaPrincipal.setVentanaPrincipal(miVentanaPrincipal);
 /**Hacemos que se cargue la ventana*/
  miVentanaPrincipal.setVisible(true);
  }
}

Al final solo bastará con ejecutar esta clase y nuestra aplicación iniciará, para esto usamos el método setVisible permitiendo cargar la ventanaPrincipal.

El Resultado.

Al ejecutar la aplicación vemos que se carga la ventanaPrincipal con los componentes mencionados, si presionamos el botón se carga la ventanaConfirmacion dependiente de la ventanaPrincipal, podemos notar las diferencias entre estas 2 ventanas, así como la propiedad que impide acceder a la principal mientras se encuentra activa la ventana de Dialogo, esto sera muy Útil cuando queremos hacer ventanas que deberían ser únicas por usuario, por ejemplo ventanas de registro o información, de modo que siempre tengamos una sola por cada evento....


Y Listo!!!
Tenemos nuestra aplicación en funcionamiento, es algo simple pero la base para construir aplicaciones completas...... mas adelante seguiremos con esta secuencia de entras básicas sobre java Swing, serán cosas sencillas pero muy útiles para quienes desean iniciar ;)

Descarga!!!

El ejemplo es muy simple, sin mayores complicaciones, aquí dejo el enlace de descarga por si lo quieren revisar ;)..está en Eclipse pero si usas NetBeans te interesará esta entrada con un vídeo paso a paso de como abrirlo en el....... recuerden que es gratis, y 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 ;)

20 comentarios:

  1. Muy bueno tu tutorial
    pero el enlace no funciona podrias revisarlo
    muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola, hace un momento lo verifique y si me descargó correctamente, que te sale???

      Eliminar
    2. lo verifiqué nuevamente, mira y me cuentas haber si ya.

      Eliminar
  2. Amí tampoco me deja, en los otros no tuve ningun problema pero este me pide que me registre. Esa página solo te deja bajarte unos pocos y luego te tienes que registrar?

    ResponderEliminar
    Respuestas
    1. Hola, muy extraño, sin embargo ya verifiqué y lo subi nuevamente por si las moscas, verifica y me cuentas por favor.

      Eliminar
  3. Hola Cristian, me preguntaba si sabias como se hace para modificar la JLabel "labelTitulo" de la clase "VentanaPrincipal" desde la clase "VentanaConfirmacion" por medio de un evento, como presionar un botón, si pudieras ayudarme o darme alguna orientación, te lo agradecería. De antemano, Gracias.

    ResponderEliminar
    Respuestas
    1. Hola, tal vez podrias mirar la entrada sobre eventos del botón en #java y reasignar el titulo, aunque tal vez te toque llamar nuevamente una instancia de la ventana....

      Eliminar
  4. porque no utilizas el extends en la ventana de confirmacion para declararla como hija de la primera? es mas sencillo

    ResponderEliminar
    Respuestas
    1. Hola, porque no se está haciendo una relación de herencia, al decir que el JDialog es Hijo no me refiero a herencia sino al concepto, pues aquí el JDialog depende del JFrame para que pueda ser bloqueado mas no se busca heredar propiedades............adicionalmente la ventana confirmación quiero que sea JDialog por ende primero lo extendí, cosa que como java no permite la herencia multiple no lo podria realizar.... un saludo

      Eliminar
    2. ya entendi, estas usando una especie de colaboracion entre clases de tal modo que una clase dependa de la otra para su ejecucion. Gracias por la explicación

      Eliminar
  5. cierto, solo agregando el extendes y el nombre de la primera clase es suficiente para volverla una subclase

    ResponderEliminar
    Respuestas
    1. Hola, Ya te contesté por G+, y como comenté arriba, no busco usar herencia, al decir que la ventana confirmación es hija lo digo de forma conceptual para indicar que esta depende del jframe, mas no es una subclase....un saludo y gracias por comentar.

      Eliminar
  6. :D Explicas genial, Gracias por el tutorial! xD

    ResponderEliminar
  7. Esta muy bien explicado, me fue muy util. Pero ahora necesito que la ventana hija regrese un valor al padre, como podria hacer esto?

    ResponderEliminar
  8. Gracias por el aportes esta muy excelente

    ResponderEliminar
  9. Cristian Henao .. Estoy buscando información (codigo exactamente Lol) acerca de duplicar un jFrame. me explico..
    Estoy elaborando un proyecto en java de escritorio, en el cual yo puedo visualizar los monitores de cada estudiante. cree una ventana tipo jInternalFrame, en la cual me muestra en vivo al estudiante. logre que cada ves que quiera conectarme c uno nuevo lo haga sin perder conexión con e primero (a eso le llamo duplicar ese jInternalFrame) pero si sigue sindo la misma ventana y no pudo guardar datos en una por que me carga ese dato en todas .. Lo que quiero es, que esas ventanas de jInternalFrame sea UNICA, para asi asignarle a esas ventanitas donde visualizo a cada estudiante un dato o nfomacon unica para cada una de ellas..
    de que forma lo puedo hacer?
    Gracias

    ResponderEliminar
  10. hola hay algun generador grafico para java(tipo plugging) para que te permita crear ventanas y los componentes solo arrastrandolos, algo como tiene VB.

    ResponderEliminar

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