Palabras clave: Librerías, Diálogos, Mensajes, Petición de datos.

Preguntas de repaso
  • ¿Qué diferencia hay entre parámetro y argumento?

  • ¿Qué quiere decir que un argumento pasa por valor?

  • ¿Qué está mal en esta declaración float miFunción (int a, void b)?

No sigas si no conoces las respuestas.

Una ventana de diálogo es una ventana que aparace de forma independiente a la ventana gráfica.

Los principales objetivos de las ventanas de diálogo son mostrar avisos y solicitar datos a los usuarios.

El formato general de una ventana de diálogo es

JOptionPane.show<tipo>Dialog();

donde

  • El número de parámetros es diferente dependiendo del tipo de ventana a mostrar, y

  • <tipo> puede ser:

    • Message para mostrar un mensaje de aviso,

    • Input para capturar un dato de entrada, o

    • Confirm para confirmar una pregunta con un sí o un no.

Hay algo nuevo en estas funciones. Constan de dos parte separadas por un punto .. Cuando se escribe así una función se está usando programación orientada a objetos. La primera parte indica que se hará una instrucción sobre ventanas de diálogo y la segunda parte indica la función o acción concreta que se realizará. En este caso se utilizan funciones para mostrar la ventana más adecuada (mensaje, entrada o confirmación).

2. Ventanas de aviso

Una ventana de aviso se construye con la siguiente instrucción:

JOptionPane.showMessageDialog(null, "Mensaje de aviso");

y con la que se obtiene el siguiente resultado:

mensajeAviso

Hay una palabra nueva en el primer argumento: null. En general, cuando creamos una ventana es porque nuestra aplicación trabaja con más ventanas. Al mostrar la ventana podemos forzar a que dependa de otras ventanas o por el contrario, con null, indicamos que no depende de ninguna y además se mostrará en el centro.

3. Ventanas para petición de datos

Existen varios tipos de ventanas para la petición de datos. La más sencilla que puede construirse viene dada por el siguiente código

String s = JOptionPane.showInputDialog("Mensaje de introducción de datos : ");

Su apariencia es similar a lo siguiente:

mensajeIntroduccion

y almacena en el String s el valor introducido en el campo de texto. Si cierras la ventana sin introducir ningún texto se guardará el valor null en la variable s.

En el caso de que quieras que el usuario seleccione una de entre dos posibles opciones entonces es recomendable usar esta otra línea de código:

int n = JOptionPane.showConfirmDialog(null, "Mensaje", "Titulo del Diálogo", JOptionPane.YES_NO_OPTION);

que genera una ventana con dos botones:

mensajeIntroduccionBinaria

En este caso retornará el valor entero 1 si seleccionas "No" y el valor 0 si seleccionas "Yes". Si cierras la ventana sin seleccionar ninguna opción se guardará el valor -1 en la variable n.

4. Conversión de datos

Como puedes ver, la función showInputDialog devuelve una cadena de caracteres y showConfirmDialog retorna enteros. Cuando desarrolles un programa quizás te interese capturar un número real con showInputDialog o interpretar el entero, 0 o 1, retornado por showConfirmDialog como un valor booleano. Para estos casos, ¿cómo podemos convertir un String o un entero a cualquier otro tipo de dato simple?

El casting aquí rara vez funciona y tendrás que hacer uso de funciones de programación. Processing dispone de las siguientes funciones que permiten transformar la información contenida en una variable a otro tipo de dato.

boolean boolean( un_int_o_un_string )

Convierte un int o string a su representación booleana. El string "true" se transforma en el valor true en otro caso es false. El entero 0 se transforma en el valor false y cualquier otro valor se transforma en true.

float float( un_int_o_un_string )

Convierte un int o string a su representación real. Si el string no responde a un número valdrá NaN y si es un entero le añadirá el punto decimal.

int int( un_dato_simple_o_un_string )

Convierte un tipo de dato primitivo o string a su representación entera.

String str( un_tipo_de_dato_simple )

Retorna la representación string de los tipos de datos primitivos.

No es lo mismo una función de conversión de datos que un casting.

  • Una función de conversión de datos es una función diseñada por programadores cuya misión es recoger la información de una variable y convertir esa información a otro tipo de dato, resultado que queda almacenado en una zona de memoria distinta a aquella donde está almacenada la información de partida. Se usan dos posiciones de memoria: una, la del argumento, que responde a un tipo de dato y otra, la asociada al valor devuelto, que responde a otro tipo de dato.

  • En un casting la información almacenada en la memoria del ordenador no se modifica, solo se fuerza al compilador a que trate (o interprete) a la información ahí almacenada como el tipo de dato indicado en el casting. Se usa una única posición de memoria.

5. Librerías

Processing no dispone de funciones para pedir datos al usuario por la pantalla. Las instrucciones que acabamos de ver para la creación de ventanas de diálogo no son instrucciones del lenguaje de programación Processing.

Pero esto no es realmente un problema. Ya sabemos que un tipo de instrucciones simples son las funciones y tú ya sabes crear funciones …​ por tanto ¡eres capaz de ampliar el lenguaje de Processing creando tus propias funciones!. Pero además de esto, los lenguajes de programación permiten también utilizar las funciones implementadas por terceros. Esto permite aumentar de forma considerable el número de funciones que resuelven problemas de muy diversa índole.

Processing permite que se añadan más funciones siempre y cuando estén escritas en lenguaje Processing o en lenguaje Java. Como las funciones expuestas que crean ventanas de diálogo son funciones que se encuentran en una librería escrita en lenguaje Java entonces sí podemos utilizarlas en Processing.

Una librería es un conjunto de funciones que están guardadas en un fichero y que pueden ser utilizadas en un lenguaje de programación para aumentar su conjunto de instrucciones.
El PDE permite añadir nuevas librerías mediante el menú Sketch > Import Library, pero puedes encontrar muchas más en https://www.processing.org/reference/libraries/.

Cuando se quiera utilizar funciones que se encuentren guardadas en una librería, recurriremos a la instrucción import para indicar a Processing que incorpore "su contenido" (nuevas funciones) a su lenguaje. La instrucción import se utiliza así:

import <nombre-de-la-libreria>;

6. ¿Cómo se utilizan los diálogos?

En lo que respecta al uso de las ventanas de diálogo se tendrá que introducir como primera línea de nuestro programa la sentencia:

import javax.swing.JOptionPane;

Así, nada más ejecutar tu programa tendrás un montón de funciones más, entre ellas tendrás las funciones JOptionPane.showMessageDialog(), JOptionPane.showInputDialog() y JOptionPane.showConfirmDialog(). Así, solo tienes que "mencionarlas" en aquellas líneas de tu programa en las que te interese mostrar un mensaje, pedir un dato o solicitar una confirmación. Veamoslo con un ejemplo sencillo.

Ejemplo 1. Conversión de metros a centímetros
1 2 3 4 5 6 7 8 9 10 11 12 13
/* Grupo ISCyP. Curso 2015-2016 */ import javax.swing.JOptionPane; // (1) void setup() { String s = JOptionPane.showInputDialog("Introduce los metros: "); // (2) float metros = float(s); // (3) JOptionPane.showMessageDialog(null, "Son "+ (metros*100) + "centímetros"); // (4) }
1 La instrucción input le indica a Processing que tiene que cargar más funciones. En concreto, todas las funciones de javax.swing.JOptionPane.
2 Declara la variable s de tipo String y le asigna el valor retornado por JOptionPane.showInputDialog().
3 Declara la variable metros de tipo float y le asigna el valor retornado por la función float() para el argumento s. Es decir, metros almacenará un valor numérico de tipo float que coincida con la secuencia de caracteres del String s.
4 Ejecuta la función JOptionPane.showMessageDialog() para imprimir en una ventana de diálogo el valor de metros haciendo concatenación (casting) con dos cadenas de caracteres.

7. Repaso

  • Las librerías son ficheros que contienen más funciones para ampliar nuestro lenguaje de programación.

  • Para cargar las funciones de las librerías en Processing se utiliza la instrucción import <nombre-de-la-librería>.

  • Processing pueden usar funciones escritas en el lenguaje Java para pedir datos al usuario mediante la instrucción import javax.swing.JOptionPane.

  • La función para mostrar mensajes es JOptionPane.showMessageDialog().

  • Las funciones para pedir datos son JOptionPane.showInputDialog() y JOptionPane.showConfirmDialog(), que retornan datos de tipo String e int respectivamente, por lo que hay que usar otras funciones para convertirlos a otros tipos de datos simples o String.