sábado, 26 de marzo de 2016

021.- Cuadros de Diálogo - Java y NetBeans


Cuadros de Diálogo

Un cuadro de diálogo es un cuadro con opciones que aparece normalmente cuando se activa una opción del menú principal del programa.

Los cuadros de diálogo tienen forma de ventana aunque no poseen algunas características de estas. Por ejemplo, no pueden ser minimizados ni maximizados.

Los cuadros de diálogo, aparte de las opciones que muestran, suelen contener dos botones típicos: el botón Aceptar y el botón Cancelar. El primero de ellos da por válidas las opciones elegidas y cierra el cuadro de diálogo. El segundo simplemente cierra el cuadro de diálogo sin hacer ninguna modificación.

He aquí algunos ejemplos de cuadros de diálogo del programa Word:




Para crear cuadros de diálogo en Java, se usa un tipo de clase llamada JDialog. Estos objetos pueden ser diseñados como si fueran ventanas, aunque representan realmente cuadros de diálogo.



Ejercicio:

  1. Crea un nuevo proyecto en NetBeans.
  2. Dentro de Source Packages crea un Java Package y llamalo paqueteInicial.
  3. Dentro de paqueteInicial crea un JFrame Form y llamalo VentanaInicial.

  1. Diseña el JFrame Form (VentanaInicial) de forma que la ventana tenga el siguiente aspecto:



Los elementos de la ventana tendrán los siguientes nombres:

-        Cuadro de texto de unidades: txtUnidades.
-        Cuadro de texto de precio: txtPrecio.
-        Etiqueta con borde del total: etiTotal.
-        Botón Calcular: btnCalcular.
-        Botón Configuración: btnConfiguracion.


  1. Se pretende que cuando se pulse el botón Calcular se calcule el total de la venta (esto se hará luego) Para hacer el cálculo se tendrán en cuenta el IGV y el Descuento a aplicar. Estos dos valores serán variables globales, ya que se usarán en distintos lugares del programa.

  1. Así pues entra en el código y declara una variable global igv y otra descuento tal como se indica a continuación (recuerda que las variables globales se colocan justo después de la línea donde se define la clase principal public class):



  1. Cuando el programa arranque, interesará que el igv por defecto sea 0, y que el descuento por defecto sea 0 también, así que en el método constructor, inicializaremos las variables globales igv y descuento a 0:



  1. Vamos a programar el botón btnCalcular. Entra en su evento actionPerformed y allí se programará la realización del cálculo de la siguiente forma:

        double unidades;
        double precio;
        double total;
        double igvImporte;
        double descuentoImporte;
        double totalSinIgv;

        //Almacenamos los valores de los cuadros de texto conviertiéndolos
        //a tipo double en las variables respectivas.
        unidades = Double.parseDouble(txtUnidades.getText());
        precio = Double.parseDouble(txtPrecio.getText());

        //Calculamos el total sin igv, el importe del igv y el importe del descuento.
        totalSinIgv = unidades * precio;
        igvImporte = totalSinIgv * igv / 100;
        descuentoImporte = totalSinIgv * descuento / 100;

        //Calculamos el importe total.
        total = totalSinIgv + igvImporte - descuentoImporte;

        //Mostramos el total en la etiqueta.
        etiTotal.setText(total + "");


  1. Puedes ejecutar el programa y comprobar que el botón Calcular funciona, aunque el cálculo que realiza lo hace con un igv igual a 0 y un descuento igual a 0.

  1. Seguidamente programaremos el botón Configuración de forma que nos permita decidir qué igv y qué descuento queremos aplicar. Este botón mostrará un CUADRO DE DIÁLOGO que permita al usuario configurar estos datos.


  1. Para añadir un cuadro de diálogo al proyecto, se tiene que añadir un objeto del tipo JDialog sobre el JFrame.



  1. Los JDialog son objetos ocultos, es decir, objetos que se colocan en la parte del Inspector llamada Otros Componentes, al igual que sucede con los menús contextuales o los JFileChooser. Observa el inspector, allí verás el JDialog que has añadido:



  1. Cámbiale el nombre. Lo llamaremos dialogoConfiguracion.

  1. Los cuadros de diálogo generalmente traen por defecto el layout BorderLayout. Para nuestro ejemplo cambiaremos el layout del JDialog por el Diseño Libre:



  1. Los JDialog se pueden diseñar independientemente, al igual que los JPanel. Solo tienes que hacer doble clic sobre el dialogoConfiguracion (en el inspector) y este aparecerá en el centro de la ventana.
  2. Así pues debes diseñar el dialogoConfiguracion para que quede de la siguiente forma:



Los elementos del cuadro de diálogo tienen los siguientes nombres:

-        El cuadro de texto del IGV: txtPorcentajeIgv.
-        El cuadro de texto del DESCUENTO: txtPorcentajeDescuento.
-        El botón Aceptar: btnAceptar.
-        El botón Cancelar: btnCancelar.

Si observas el Inspector debe tener el siguiente aspecto:



  1. Se pretende que cuando se pulse el botón Configuración en la ventana principal, debe aparecer el cuadro de diálogo dialogoConfiguracion, que acabas de diseñar:



  1. Para conseguir esto, debes programar en el evento actionPerformed  del botón btnConfiguracion lo siguiente:

        dialogoConfiguracion.setSize(300, 220);
        dialogoConfiguracion.setLocation(100, 100);
        dialogoConfiguracion.setVisible(true);


  1. El código anterior hace lo siguiente:

-        A través del método setSize se asigna un tamaño de 300 x 220 al cuadro de diálogo.
-        A través del método setLocation se determina que el cuadro de diálogo aparecerá en la posición (100, 100) de la pantalla.
-        A través del método setVisible hacemos que el cuadro de diálogo se muestre.


  1. Ejecuta el programa y observa lo que sucede cuando pulsas el botón Configuración. Debería aparecer el cuadro de diálogo en la posición establecida y con el tamaño definido:



  1. Los botones Aceptar y Cancelar del cuadro de diálogo aún no hacen nada. Así que los programaremos. Empezaremos por el más sencillo, el botón Cancelar.

  1. El botón Cancelar de un cuadro de diálogo simplemente cierra dicho cuadro de diálogo. Para ello, debes añadir el siguiente código en el evento actionPerformed del botón Cancelar del diálogo:

        dialogoConfiguracion.dispose();


El método dispose se usa para cerrar un cuadro de diálogo. También se puede usar para cerrar un JFrame.

  1. Ejecuta el programa de nuevo y comprueba el funcionamiento del botón Cancelar del cuadro de diálogo.

  1. Ahora programaremos el botón Aceptar. Cuando el usuario pulse este botón, se actualizará el valor del igv y del descuento por los que haya introducido. Es decir, se traspasarán los valores introducidos en los cuadros de texto txtPorcentajeIgv y txtPorcentajeDescuento a las variables globales igv y descuento.

Una vez que se haya hecho esto, el cuadro de diálogo se debe cerrar.

  1. Este es el código que hace lo anterior. Debe programarlo en el evento actionPerformed del botón Aceptar:

igv = Double.parseDouble(txtPorcentajeIgv.getText());
descuento = Double.parseDouble(txtPorcentajeDescuento.getText());
dialogoConfiguracion.dispose();


  1. Observe el código. Primero se traspasa los valores de los cuadros de texto a las variables globales y luego se cierra el cuadro de diálogo.
  2. Compruebe el funcionamiento del programa de la siguiente forma:

    1. Ejecute el programa.
    2. Introduzca 5 unidades y 20 de precio.
    3. Si pulsa calcular, el total será 100. (No hay ni igv ni descuento al empezar el programa)
    4. Ahora pulse el botón Configuración, e introduzca un igv del 18. El descuento déjelo a 0. Acepte.
    5. Ahora vuelva a calcular. Observe como ahora el total es 118.0, ya que se tiene en cuenta el igv configurado.
    6. Pruebe a configurar un descuento y vuelva a calcular.


  1. Se pretende ahora mejorar un poco el cuadro de diálogo, añadiéndole un título. Seleccione el cuadro de diálogo en el Inspector y luego busque su propiedad title. En ella escriba “Configuración  igv y descuento”.

  1. Vuelva a ejecutar el programa. Observe la barra de título del cuadro de diálogo:



  1. Ahora se estudiará el concepto de cuadro de diálogo modal y cuadro de diálogo no modal.

  • Un cuadro de diálogo no modal. Es aquel que permite activar la ventana desde la que apareció. Los cuadros de diálogo añadidos a un proyecto son por defecto no modales.

  1. Ejecuta el programa y prueba a hacer lo siguiente:

    1. Pulsa el botón Configurar. Aparecerá el cuadro de diálogo.
    2. Pulsa sobre la ventana.



    1. Observarás que la ventana se activa, colocándose sobre el cuadro de diálogo.



    1. Esto es posible gracias a que el cuadro de diálogo es no modal.

    1. A veces, puede ser interesante que se active la ventana pero que el cuadro de diálogo siga delante de ella. Para conseguir esto, es necesario activar la propiedad del cuadro de diálogo llamada alwaysOnTop. Activa esta propiedad:



    1. Ahora ejecuta el programa de nuevo y haz que se visualice el cuadro de diálogo de configuración. Podrás comprobar que se puede activar la ventana e incluso escribir en sus cuadros de textos, y que el cuadro de diálogo sigue visible:



    1. Es muy común, cuando tenemos un cuadro de diálogo no modal, usar la propiedad alwaysOnTop, para que siempre aparezca delante de la ventana.


  1. Ahora se estudiará el concepto de cuadro de diálogo modal.

  • Un cuadro de diálogo modal es aquel que no permite que se active otra ventana hasta que este no se haya cerrado.

  1. Para convertir nuestro cuadro de diálogo en modal, será necesario que lo selecciones en el inspector y busques la propiedad modal. Debes activar esta propiedad.



  1. Ahora ejecuta el programa y comprueba lo siguiente:

    1. Haz que se visualice el cuadro de diálogo de configuración.

    1. A continuación intenta activar la ventana haciendo clic sobre ella. Verás que no es posible activarla. Es más, intenta escribir en sus cuadros de texto. No será posible hacerlo. (Incluso observarás un parpadeo en el cuadro de diálogo avisándote de ello). Esto es debido a que ahora nuestro cuadro de diálogo es modal.



    1. Solo cuando pulses Aceptar o Cancelar, o cierres el cuadro de diálogo, podrás seguir trabajando con tu ventana.



CONCLUSIONES:

Los Cuadros de Diálogo son ventanas simplificadas que muestran distintas opciones al usuario.

La clase JDialog es la que permiten la creación y uso de cuadros de diálogo en un proyecto java.

Para visualizar un JDialog será necesario llamar a su método setVisible. También son interesantes los métodos setSize para asignarles un tamaño y setLocation para situar el cuadro de diálogo en la pantalla.

Para cerrar un JDialog será necesario invocar a su método dispose.

Existen dos tipos de cuadros de diálogo: los modales y no modales.

Los cuadros de diálogo modales no permiten que se active otra ventana hasta que el cuadro de diálogo se haya cerrado.

Los cuadros de diálogo no modales permiten trabajar con otra ventana a pesar de que el propio cuadro de diálogo no haya sido cerrado.




viernes, 25 de marzo de 2016

020.- Uso de Layouts y Paneles - Java y NetBeans


Técnicas de distribución de elementos en las ventanas

Al momento de diseñar una ventana se tienen en cuenta dos cosas:

-        La facilidad a la hora de colocar donde queramos los componentes en la ventana.
-        Que dichos componentes estén siempre visibles independientemente del tamaño de la ventana.

La distribución AbsoluteLayout por ejemplo nos da mucha facilidad a la hora de colocar los elementos en la ventana, pero sin embargo los componentes no se adaptan a los cambios de tamaño.

El Diseño Libre en cambio nos permite crear ventanas en las que sus componentes se “recolocan” según el tamaño de estas pero a cambio crece la dificultad del diseño.

Para aprovechar las ventajas de los distintos layouts y minimizar sus inconvenientes, es habitual en java crear una estructura de paneles cada uno de ellos con un layout distinto, según nuestras necesidades.

Normalmente, al JFrame se le asigna un layout que lo divida en zonas, como puede ser el BorderLayout o el GridLayout. Luego, dentro de cada una de estas zonas se coloca un panel (objeto JPanel). Y a cada uno de estos paneles se le asigna el layout que más le convenga al programador (FlowLayout, Diseño Libre, AbsoluteLayout, etc…). Finalmente, dentro de cada panel se añaden los componentes de la ventana.



Ejemplo:

  1. Crea un nuevo proyecto en NetBeans.
  2. Dentro de Source Packages crea un Java Package y llamalo paqueteInicial.
  3. Dentro de paqueteInicial crea un JFrame Form y llamalo VentanaInicial.

Se pretende crear un proyecto con una ventana de diseño complejo. Para ello sigue los siguientes pasos:

  1. En primer lugar, asigna un BorderLayout al JFrame:



  1. El BorderLayout divide la ventana principal en zonas. Ahora añade un panel (JPanel) a la zona norte de la ventana.



  1. Cambia el nombre a este panel y llámalo panelTitulo, ya que contendrá el nombre del programa.



  1. Añade otro panel, esta vez a la parte central. El panel se llamará panelDatos:




  1. Añade un nuevo panel en la parte sur de la ventana. Su nombre será panelEstado.


NOTA. A veces es complicado agregar un panel en una zona de la ventana cuando tenemos un BorderLayout. Para ello haz clic derecho sobre JFrame en el Inspector y activar la opción Add From Palete – Swing Containers – Panel.



  1. Si el panel no se coloca en el sitio deseado, se puede seleccionar en el Inspector y activar su propiedad Dirección, e indicar la zona donde se quiere colocar:



El panel debería estar situado finalmente en el sur de la ventana:



  1. El Inspector tendrá la siguiente forma ahora:



  1. Ahora añade otro panel en la zona oeste llamado panelBotones y otro en la zona este llamado panelVerificacion. El Inspector debería tener la siguiente forma al finalizar:



  1. Cada panel puede ser diseñado de forma individual, simplemente haciendo doble clic sobre él. Así pues, empezaremos diseñando el panel panelBotones. Haz doble clic sobre él.
  2. En la parte izquierda del NetBeans aparecerá únicamente el panelBotones. Agrándalo para que tenga la siguiente forma:



14.     A cada panel se le puede asignar un Layout distinto. A este panel le asignaremos un AbsoluteLayout para poder colocar cada elemento donde quiera. Asigna un AbsoluteLayout al panel haciendo clic derecho sobre él en el Inspector. El Inspector debería quedar así:



  1. Ahora añade cinco botones al panel. Observa como tienes libertad total para colocar cada botón donde quieras. Procura que el panel quede así:

 


(No nos vamos a preocupar en este ejercicio de los nombres de los componentes)

  1. Ahora diseña el panel panelVerificacion haciendo doble clic sobre él.

  1. Asígnale también un layout AbsoluteLayout.

  1. Coloca en él cinco casillas de verificación. El aspecto del panel al terminar debe ser parecido al siguiente:



Y el Inspector debe tener un aspecto similar a este:



  1. Ahora se diseñará el panelTitulo. Haz doble clic sobre él.

  1. En este caso se le añadirá un FlowLayout. Recuerda que este layout hace que cada elemento se coloque uno detrás de otro.

  1. Añade al panel tres etiquetas como las que siguen. Ponle un borde a cada una:



El Inspector tendrá este aspecto en lo que se refiere al panelTitulo:



  1. El panelEstado lo diseñaremos sin asignar ningún layout, es decir, usando el Diseño Libre. En él añadiremos cuatro etiquetas de forma que estas mantengan una distancia relativa con respecto al límite derecho del panel. Dicho de otra forma, que siempre estén pegadas a la parte derecha del panel:



Observa las líneas “guía”. Indican que las etiquetas dependen de la parte derecha del panel. A su vez cada una depende de la otra. Es como si estuvieran “enganchadas”, como los vagones de un tren.


  1. El panelDatos lo vamos a complicar un poco. Haz doble clic sobre él para diseñarlo y asígnale un GridLayout.



  1. Marca el GridLayout y asígnale 3 filas y 2 columnas usando sus propiedades Rows y Columns respectivamente, para que interiormente tenga forma de una rejilla como esta:



  1. A cada una de las divisiones del GridLayout del panelDatos le asignaremos un nuevo panel.  Añade al panelDatos seis paneles. Esto lo puedes hacer fácilmente haciendo clic con el botón derecho del ratón sobre el panelDatos en el Inspector y eligiendo la opción Add From Palette – Swing Containers – Panel.

El aspecto del inspector debería ser como el que sigue, en lo que se refiere al panelDatos:



  1. Asignaremos a cada uno de los seis paneles los siguientes nombres: panelEtiqueta1, panelCuadro1, panelEtiqueta2, panelCuadro2, panelEtiqueta3 y panelCuadro3. El panelDatos quedará así en el Inspector.



Así pues, el panel panelDatos tiene forma de rejilla con seis celdas, y en cada celda hay un panel. Puede imaginarse el panelDatos así:



  1. Ahora añada al panelEtiqueta1, panelEtiqueta2 y panelEtiqueta3 sendas etiquetas. Y al panelCuadro1, panelCuadro2 y panelCuadro3 sendos cuadros de texto. El panel panelDatos debe quedar así:



  1. Finalmente ejecuta el programa y comprueba como se comportan los elementos según el panel donde se encuentre y el layout asignado a cada uno.



CONCLUSIONES:

Para el diseño de ventanas muy complejas, se suelen definir layouts que dividan en zonas el JFrame, como por ejemplo el BorderLayout o el GridLayout.

Dentro de cada una de dichas zonas se añade un JPanel, al que se le asigna un AbsoluteLayout, un FlowLayout o se mantiene el Diseño Libre.

Es posible asignar a un panel un layout de zonas, como el GridLayout y a su vez introducir en él nuevos paneles, y así sucesivamente.