octubre 28, 2011

JOptionPane.showInputDialog();

En esta ocasión aprenderemos a utilizar la clase JOptionPane en nuestros programas, esta clase genera cuadros de dialogo para pedir datos a un usuario o para arrojar un cuadro de dialogo de aviso. Son de gran utilidad, ya que en la mayoría de los programas se necesita pedir datos al usuario para que el programa realice la tarea que se le programó. Hasta ahora nosotros como programadores hemos asignado los datos (los valores) a nuestra variables para que nuestro programa trabaje con ellas, pero ahora haremos que el usuario del programa le de esos valores de manera directa sin necesidad modifiquemos nuestro valor de variable para cada problema diferente. A continuación un código de ejemplo:

Pedir un nombre al usuario

//Archivo: PruebaJOption.java

import javax.swing.JOptionPane;

public class PruebaJOption{
 
 public static void main(String args[]){
  
  String nombre;
  nombre = JOptionPane.showInputDialog("¿Cual es tu nombre?");
  
  System.out.println("Hola "+nombre);
 }
}
Este es un programa sencillo que pide datos al usuario, en este caso, le pide el nombre al usuario, este programa solo saluda al usuario, osea imprime una linea de texto con el mensaje "Hola" seguido del nombre que el usuario introduzca.

Para poder usar la clase JOptionPane necesitamos importar la librería donde se encuentra esa clase a nuestro programa, esto lo hacemos en la linea numero 3. Despues declaramos nuestra clase, nuestro main, y en la linea 9 declaramos una variable String nombre. En la linea 10 empieza lo interesante ya que estamos asignándole el valor a nuestra variable nombre; Convencionalmente como lo habíamos hecho anteriormente para asignarle un valor a nuestra variable nombre solo escribiríamos en nuestro código la variable nombre y asignarle algún nombre cualquiera, por ejemplo: nombre="Alberto";.

Pero con el uso del JOptionPane.showInputDialog(), java arroja una ventana donde hay una caja de texto el la cual el usuario ingresara su nombre. En nuestra instrucción nombre = JOptionPane.showInputDialog("¿Cual es tu nombre?"); de la linea 10 estamos indicando que se abra una cuadro de dialogo que diga "¿Cual es tu nombre?" y que tenga una caja de texto para que el usuario pueda escribir la respuesta a esa pregunta ahí. Aparecerá una ventana mas o menos así:


El usuario ingresara su nombre y pulsara el botón "Aceptar", supongase que el usuario ingreso el nombre "Adam", entonces ese nombre que introdujo el usuario al momento de pulsar "Aceptar" se guardara en nuestra variable String nombre para ser usada por nuestro programa para realizar sus tarea u operaciones. Después de lo anterior nuestra variable nombre contiene la cadena de caracteres "Adam", y en la linea 12 imprime el mensaje "Hola" más lo que contiene nuestra variable nombre, por tanto se mostrara en pantalla el siguiente texto: "Hola Adam", ahí finaliza este programa.


Pedir datos numéricos al usuario para realizar operaciones matemáticas.

Para realizar cálculos con datos proporcionados por el usuario, es muy sencillo, un tanto similar a lo que se hizo anterior mente, solo que hay que tomar en cuenta algunas cosas.

Hay que tomar en cuenta y dejar muy en claro que la instrucción JOptionPane.showInputDialog(); siempre nos retornara una cadena de caracteres (un String), por eso siempre que utilicemos esa instrucción tenemos que guardar su resultado en una variable de tipo String, que ya debió haber sido declarada anteriormente (como en el primer código). De tal modo que si nosotros queremos que el usuario introduzca un numero para hacer alguna operación, se guardara lo que el usuario introdujo en formato de cadena de caracteres.

Es obvio pensar que con cadenas de caracteres no se pueden realizar cálculos, pero si el usuario introduce un numero en la caja de texto, como ya mencionamos, este se guardara como texto y no como un cifra matemática. Para esto java tiene una instrucción que convierte cadena de caracteres a números o cifras matemáticas con la que se pueden realizar operaciones; veamos el siguiente codigo:
//Archivo: PruebaJOption.java

import javax.swing.JOptionPane;

public class PruebaJOption{
 
 public static void main(String args[]){
  
  String numero1;
  String numero2;
  numero1 = JOptionPane.showInputDialog("Introduce un numero entero:");
  numero2 = JOptionPane.showInputDialog("Introduce un numero con punto decimal:");
  
  int num1;
  double num2;
  num1 = Integer.parseInt(numero1);
  num2 = Double.parseDouble(numero2);
  
  double suma = num1+num2;
  
  System.out.println("La suma es: "+suma);
 }
}
Este programa le pedirá al usuario 2 números, uno entero y uno con decimales, y posteriormente sumará esos números y mostrara en pantalla el resultado de esta suma. Para pedir los números declaramos 2 variables de tipo String a las que llamaremos numero1 y numero2, posteriormente en la linea 11 usando el JOptionPane pedimos el primer numero (el numero entero) al usuario y lo que escriba el usuario se guardara en la variable numero1, después pedimos el segundo numero (el numero con punto decimal) y lo que retorne de esa instrucción se guardara en la variable numero2; Bien, ya tenemos los datos que el usuario introdujo a nuestro programa y esos son los datos necesarios para que nuestro programa pueda realizar su tarea, pero tenemos estos datos (los números que introdujo el usuario) como cadena de caracteres así que aun no podemos realizar cálculos matemáticos con ellos.

En las lineas 14 y 15 declaramos int num1 (una variable de tipo entero) y int num2 (una variable de tipo numero con decimal) respectivamente. Debido a que vamos a convertir a números matemáticos las variables: numero1 que convertiremos a int y numero2 que convertiremos en double.
Pasando a la linea 16 hacemos la conversión de numero1 en un int con la instrucción num1 = Integer.parseInt(numero1); esta instrucción indica que convierta a un numero en formato int lo que contiene la variable de tipo String numero1 y que el resultado lo guarde en la variable int num1. En la linea 17, num2 = Double.parseDouble(numero2); indicamos que convierta lo que contiene la variable numero2 a un número en formato double y que lo guarde en la variable double num2. Ahora si ya tenemos nuestros datos en un formato de cifras matemáticas con los cuales podemos realizar cálculos.

En la linea 19 declaramos una variable suma de tipo double y le asignamos lo que resulte de la suma de lo que contengan las variables num1 y num2. Y ya por ultimo solo tenemos que mostrar el resultado final de la tarea que realizo nuestro programa, imprimimos en pantalla un mensaje de texto que diga: "La suma es: ", seguido de nuestra variable suma que contiene el resultado de la operación, y termina nuestro programa.


Null, cuando el usuario presiona el botón "Cancelar"

Cuando el usuario al momento de que le salga el cuadro de dialogo pidiendo el dato no introduce nada y da "Aceptar" lo único que hace es mandar una cadena de caracteres sin ningún caracter, osea una cadena en blanco, pero aunque sea una respuesta que no tiene letras ni números AUN SIGUE SIENDO UNA CADENA DE CARACTERES, de tal manera que en el primer programa imprimirá el mensaje "Hola" seguido de lo que contenga nuestra variable nombre, pero como nombre no contendrá ningun caracter, la salida en pantalla solo se vera como: "Hola".

Pero en el caso del segundo programa, si al momento de que java arroje la primera ventana pidiendo el primer numero, el usuario no ingresa ningún dato y da "Aceptar", y lo mismo hace para cuando pida el segundo numero, el resultado final sera un ERROR de lógica del programa, ya que al no ingresar nada en la caja de texto, se guardara una cadena de caracteres en blanco y una cadena de caracteres en blanco no puede convertirse en un numero int o double, necesita ser una cadena de caracteres que contenga un numero para poder ser transformado a los formatos necesarios para hacer operaciones matemáticas, entonces al momento de que el programa intente realizar la suma de los dos números o de las variables num1 y num2, hallara que estan vacíos y que no pueden sumarse. El mensaje de error mostrado sera algo mas o menos así:


Lo mismo pasara, en el segundo programa, si el usuario en lugar de introducir un numero, introduce una letra o cualquier otro caracter diferente a un numero, ya que las letras o los caracteres especiales no pueden convertirse de una cadena de caracteres a un numero en formato double o int.

Hemos estudiado las posibles formas en que un usuario podría insertar los datos en la caja de texto del cuadro de dialogo arrojado por el JOptionPane, pero has ahora solo hemos hablado de cuando el usuario pulsa el botón "Aceptar" en nuestro cuadro de dialogo, pero ¿que pasa si el usuario pulsa el botón CANCELAR?.

Si el usuario pulsa el botón cancelar, el programa no se detendrá ahí, si no que guardara ese valor en la variable que le hallamos asignado. Cuando se pulsa el botón cancelar el JOptionPane ya no retorna un numero, ni una cadena de caracteres, ni una cadena de caracteres en blanco, ni ningún dato especifico, sino que regresa un VALOR VACÍO, UN VALOR NULO al que se le llama NULL. Null no es un valor, es un vacío,  cuando hablamos de una cadena de caracteres en blanco decimos que es una cadena que contiene nada, pero cuando hablamos de un valor null decimos que es ausencia de valor.

Java lee null como un vacío y no puede realizar operaciones con ese valor, mas que solo operaciones lógicas para tomar decisiones. Si nosotros damos cancelar cuando nos aparezca el cuadro de dialogo en nuestro primer programa al final nos imprimirá en pantalla un mensaje que diga: "Hola null"; Pero en nuestro segundo programa nos volverá a arrojar el mensaje de error anteriormente explicado, debido a que nuestras variables estarán vacías y no se podrán realizar cálculos con estas.

Para combatir este error lógico ocasionado por el null, podemos contrarrestarlo con una instrucción lógica de control, de toma de decisiones, como un if, por ejemplo.
Para entenderlo mejor haremos un programa donde el usuario introduzca su edad y el programa determine si es mayor de edad o no, pero si el usuario pulsa "Cancelar" el programa debe terminarse, porque suponemos que si un usuario esta cancelando la operación es porque ya no necesita del programa. He aquí:
// Archivo: PruebaJOption.java

import javax.swing.JOptionPane;

public class PruebaJOption {

 public static void main(String args[]) {
 
  String edad;
  edad="";
  edad=JOptionPane.showInputDialog("¿Cual es tu edad?");
  
  if(edad==null)
   System.out.println("La operacion ha sido cancelada");
  else {
   int edad2;
   edad2 = Integer.parseInt(edad);
 
    if(edad2>=18)
     System.out.println("Eres mayor de edad");
    else
     System.out.println("Eres menor de edad");
  }
 }
}
Como ya lo estudiamos lo primero que hacemos es importar la libreria en la linea numero 3,  se declara la variable String edad en la linea 9, y en la linea 8 se le asigna una cadena vacía ala variable edad, en la linea 10 ponemos nuestra instrucción JOptionPane donde el usuario insertara su edad, supongase que el usuario presiona la tecla "CANCELAR" entonces el JOptionPane retornara un null que se guardara en nuestra variable edad, ahora pasara a la linea 13 donde hay un if que dice que si la variable edad es igual a null (vacío) se imprimirá el mensaje ahí contenido; Y como efectivamente, cuando el usuario presionó "cancelar" retorno un null y edad ahora vale null, por tanto esa condición se cumple y se muestra en pantalla el mensaje: "La operación ha sido cancelada", y ahí termina nuestro programa.

Si el usuario en lugar de presionar "cancelar" hubiese escrito un numero, 20 por ejemplo, el programa hubiera pasado a nuestra instrucción if donde se iba a evaluar ¿20 es igual a null?, esto no no se cumple por tanto se pasara a la instrucción else, donde se crea otra variable de tipo int llamada edad2 que es donde se va a almacenar el numero matemático ya convertido de la edad que proporciono el usuario (recuerde que el JOptionPane retorno un String y que hay que convertirlo a int para realizar la operación lógica). En la linea 17 se convierte la variable String edad a un numero en formato int y se guarda en la variable edad2, ya tenemos nuestro numero para hacer la operación, así que ahora anidamos otro if para determinar si es mayor de edad o no. Evaluamos la variable int edad2 (con valor de 20) en nuestro if, y evalúa: ¿edad2 es mayor o igual a 20?, y la respuesta sera verdadera, lo condición se cumple, por tanto se ejecuta la impresión en pantalla inmediata al if, por lo cual se mostrara el siguiente mensaje en pantalla: "Eres mayor de edad", y ahí termina el programa.

Es muy importante visualizar que hemos convertido la variable edad a un int después de que el if revise que edad no sea igual a null, ya que si lo convertimos antes de esto, se ocasionará el error lógico  porque como ya dijimos, java no puede convertir un null a un int, se necesita una cadena de caracteres con un numero para poderlo transformar a un int.


Plus

Para ahorrar lineas de código podemos realizar varias operaciones en una misma linea, como por ejemplo declarar y asigna en una solo linea:
// Archivo: PruebaJOption.java

import javax.swing.JOptionPane;

public class PruebaJOption {

 public static void main(String args[]) {
 
  int edad = Integer.parseInt(JOptionPane.showInputDialog("¿Cual es tu edad?"));
  System.out.println("Tu edad es: "+edad);
  
 }
}
Este programa solo pide al usuario su edad y la imprime en pantalla, nótese que en la misma linea se declara la variable de tipo int y ahi mismo se hace la conversión y también se pide el dato al usuario mediante el JOptionPane. Se puede leer como que int edad va a guardar lo que resulte de la conversión de lo que retorne el JOptionPane.

10 comentarios:

  1. Saludos,

    Excelente artículo, muy didactico y detallado en la explicación.

    Me permito someter a cosideración la siguiente información, muy detallada para el manejo de las respuestas de JOptionPane cuando el susuario cierra la ventana, presiona cancel, y otros botones:

    http://www.java2s.com/Code/JavaAPI/javax.swing/JOptionPaneCANCELOPTION.htm

    ResponderBorrar
    Respuestas
    1. Estimado Gian D'Amico agradecemos la valiosa aportación que haces en tu comentario, nos es bastante útil, y siempre es un placer hacer post atendiendo a las dudas y sugerencias de nuestros lectores. Recibe un cordial saludo por parte del equipo de Buenas Intenciones.

      Borrar
  2. gracias! muy bien explicado me sirvió de mucho,
    Saludos!

    ResponderBorrar
  3. hola gracias me fue de mucha a ayuda pero me quedo una duda como corregimos cuando el usuario da Aceptar?

    ResponderBorrar
  4. muy bueno pero tengo una duda si utilizas el plus es decir hacer la conversion de String a entero y ya ahi en ves de aceptar das click en cancelar marac error por lo que explicastes en el apartado-->Null, cuando el usuario presiona el botón "Cancelar"<-- mi pregunta es no se puede hacer la conversion directa y que cuando des click en cancelar no envie ese error, la unica forma de evitarlo es hacerlo por separado como explicastes vayase la redundancia -->Null, cuando el usuario presiona el botón "Cancelar"<--

    ResponderBorrar
  5. Muchas gracias. Me sacaste de un problema.

    ResponderBorrar
  6. Me ayudó bastante, gracias!!!

    ResponderBorrar
  7. Me acabas de salvar el semestre JAJAJAJA Buen contenido, gracias

    ResponderBorrar
  8. Buenas tardes mi pregunta es como hacer la validacion del boton Cancelar o X con un try catch?, muchas gracias

    ResponderBorrar
  9. una pregunta por que no me aparece la ventana emergente cuando realizo el codigo

    ResponderBorrar