7. Mensajes al Usuario y Lectura Simple de Datos
7.1. Mensajes en la Consola
Para presentar un mensaje en la ventana de comandos del sistema operativo, se utiliza la instrucción System.out.println(cadena)
. Es poco usual enviarle mensajes al usuario a esa ventana, pero en algunos casos (errores fatales, por ejemplo), esto es indispensable.
Si el programa se está ejecutando en un ambiente de desarrollo como Eclipse, los mensajes aparecerán en una ventana especial llamada consola.
System.out.println( "Hola mundo..." );
Se puede utilizar esta instrucción, en cualquier clase de la interfaz, para enviar un mensaje al usuario a la ventana de comandos del sistema operativo.
Si durante la ejecución de un programa se lanza una excepción que no es atrapada por ninguna clase de la interfaz, la acción por defecto es generar una secuencia de mensajes en la ventana de comandos, con información relativa al error.
7.2. Mensajes en una Ventana
El paquete swing incluye una clase JOptionPane que, entre sus múltiples usos, tiene un método para enviarle mensajes al usuario en una pequeña ventana emergente. Esto es muy útil en caso de error en las entradas del usuario o con el fin de mostrarle un resultado puntual de una consulta. La sintaxis de uso es la que se muestra en el ejemplo 9.
Ejemplo 9
Objetivo: Mostrar la manera de presentar un mensaje a un usuario, usando una ventana simple de diálogo.
Este ejemplo muestra la manera de enviarle mensajes al usuario, abriendo una nueva ventana y esperando hasta que el usuario oprima el botón para continuar. En cada imagen aparece la ventana que se va a mostrar al usuario y, debajo, la instrucción que ordena hacerlo. Esta instrucción debe ir dentro de un método de un panel.
Mensaje de error:
JOptionPane.showMessageDialog( principal, "Debe ingresar una línea.", "Buscar por línea", JOptionPane.ERROR_MESSAGE );
Mensaje de advertencia:
JOptionPane.showMessageDialog( this , "Ya se encuentra en el último vehículo.", "Ver último vehículo" , JOptionPane.WARNING_MESSAGE );
Mensaje de información:
JOptionPane.showMessageDialog( this , "El valor a pagar es: $3.675.000" , "Cálculo de Impuestos" , JOptionPane.INFORMATION_MESSAGE );
7.3. Pedir Información al Usuario
Cuando la información que se necesita como entrada de un requerimiento funcional es muy sencilla (un nombre o un valor numérico), se puede utilizar un método de la clase JOptionPane que abre una ventana de diálogo y luego retorna la cadena tecleada por el usuario. Su uso se ilustra en el ejemplo 10. Si la información que se necesita de parte del usuario es más compleja, se debe utilizar un cuadro de diálogo más elaborado, en el cual irían los componentes gráficos necesarios para recoger la información.
Ejemplo 10
Objetivo: Mostrar la manera de pedir información simple al usuario.
Este ejemplo muestra la manera de pedir al usuario que teclee alguna información en una nueva ventana de diálogo. Al igual que en el ejemplo anterior, en cada imagen aparece la visualización de la ventana y, debajo, el código en Java que la presenta y que recupera el valor tecleado. Esta instrucción debe ir dentro de un método de un panel o ventana.
String strModelo = JOptionPane.showInputDialog( this , "Introduzca el modelo buscado:", "Buscar modelo", JOptionPane.QUESTION_MESSAGE );
if( strModelo != null )
{
// el usuario tecleó algo
}
int resp = JOptionPane.showConfirmDialog( this , "Está seguro que desea cerrar?" , "Confirmación" , JOptionPane.YES_NO_OPTION ); );
if( resp == JOptionPane.YES_OPTION )
{
// el usuario seleccionó Sí
}
7.4. Validación y formateo de datos
Cuando el usuario ingresa alguna información, la interfaz tiene muchas veces la responsabilidad de convertirla al formato y al tipo adecuados para poder manipularla (por ejemplo, convertir una cadena en una variable de tipo entero o pasar una cadena a minúsculas). De la misma manera, si el usuario tecleó un contenido que no corresponde a lo esperado (ingresó una letra cuando se esperaba un número), la interfaz debe advertir al usuario de su error. Vamos entonces por partes para ver cómo manejar cada uno de los casos.
Para convertir una cadena de caracteres (que sólo contenga dígitos) en un número, se utiliza el método de la clase Integer llamado parseInt, usando la sintaxis que se muestra a continuación. Dicho método lanza una excepción cuando la cadena que se pasa como parámetro no se puede convertir en un valor entero. En la sección de recuperación de la excepción (sección catch) podría incluirse un mensaje al usuario.
String strModelo = JOptionPane.showInputDialog( this , "Introduzca el modelo buscado:", "Buscar por modelo", JOptionPane.QUESTION_MESSAGE );
if( strModelo != null )
{
try
{
int nModelo = Integer.parseInt( strModelo );
}
catch( Exception e )
{
JOptionPane.showMessageDialog( principal, "Debe ingresar un valor numérico.", "Buscar por modelo", JOptionPane.ERROR_MESSAGE );
}
}
- Suponga que queremos convertir el modelo del vehículo que ingresó el usuario en el valor entero correspondiente (si ingresó la cadena "2016", queremos obtener el valor entero 2016).
- Lo primero que hacemos es tomar la cadena de caracteres ingresada por el usuario en el JInputDialog.
- Luego intentamos convertir dicha cadena en el valor entero correspondiente.
- En este ejemplo, si se produce una excepción, le presentamos un mensaje al usuario indicándolo .
- Este esquema de conversión es típico de las interfaces gráficas, puesto que no estamos seguros del tipo de datos de lo que ingresó el usuario y, en algunos casos, es conveniente verificarlo antes de continuar.
La clase String, por su parte, nos ofrece los siguientes métodos para transformar la cadena tecleada por el usuario:
- toLowerCase( ): convierte todos los elementos de una cadena de caracteres a minúsculas.
- toUpperCase( ): convierte todos los elementos de una cadena de caracteres a mayúsculas.
- trim( ): elimina todos los caracteres en blanco del comienzo y el final de la cadena.
En la siguiente tabla se muestran algunos ejemplos del uso de los métodos anteriores:
String ejemplo = " La Casa "; | // valor inicial de la cadena |
---|---|
String minusculas = ejemplo.toLowerCase( ); | minusculas.equals(" la casa " ) |
String mayusculas = ejemplo.toUpperCase( ); | mayusculas.equals(" LA CASA " ) |
String sinBlancos = ejemplo.trim( ); | sinBlancos.equals("La Casa" ) |