logoAlgo muy común a la hora de programar, es como avisar al usuario de ciertas actividades, o como hacerlo escoger para recapacitar o darle la oportunidad de elegir que es lo que se desea hacer, para esto, en Java tenemos elementos muy sencillos pero funcionales, que nos permiten mostrar mensajes de dialogo, o cuadros de dialogo, como los prefieran llamar, estos elementos son sumamente sencillos de utilizar con un poco de lectura al API de Java, sin embargo, como siempre, surgen las dudas, y para aclararlas dedicaré este post para mostrarles los diferentes tipos de diálogos que podemos utilizar en Swing, bien, para esto he preparado lo siguiente (Utilizando Netbeans como IDE):
  • Un proyecto con un nombre cualquiera (En este caso SerProgramador.es).
  • Un paquete donde iremos trabajando durante este post.
Y con esto, comencemos a trabajar, dado que existen varias formas de hacer distintos tipos de cuadros de diálogo, comenzaremos a verlos uno por uno para no romper con el esquema de trabajo, los cuadros de dialogo que veremos en este post estarán basados en el objeto JOptionPane, un objeto de java que nos permite precisamente trabajar con cuadros de dialog, los métodos de este objeto que veremos, serán los siguientes:
  • showMessageDialog
  • showInputDialog
  • showConfirmDialog
  • showOptionDialog
De antemano les comento que la entrada la irá actualizando hasta terminarla, pero por lo pronto ya tenemos algo con que comenzar:

showMessageDialog

Ok, para probar esté método, lo único que haremos será crear una clase con un método main, vamos a suponer que la clase se llama, MessageDialog: Bien, fácil, ahora, vamos a jugar un poco con esto, para acceder a este método simplemente tenemos que importar la clase JOptionPane, aunque normalmente netbeans lo hace por nosotros pondré la línea de código por cualquier cosa: Una vez importado lo único que tenemos que hacer es teclear el nombre de la clase más el método que queremos utilizar, teniendo en cuenta una cosa, el método showMessageDialog tiene 3 sobrecargas del método, uno que recibe 2 parametros, otro de  4, y otro de 5, vamos a ver uno por uno para observar como vamos personalizando cada vez más nuestro mensaje, el primero que veremos es el de dos parametros: Bien, explicación rápida, el primer parámetro, representa el componente padre sobre el cual el mensaje se mostrará, si nosotros no le enviamos ninguno, como en este caso lo estamos haciendo, simplemente mostrará una ventana similiar a la siguiente: message2 Si nosotros le enviamos un componente, se colocará encima de el, sin ninguna variación en el funcionamiento, el segundo parámetro obviamente, es el mensaje que queremos observar, y listo, un mensaje fácil de hacer, bien, ahora veamos otra cosa, el anterior fue el método con dos parámetros, ahora bien, cuando utilizamos el método de cuatro parámetros tenemos un poco más de personalización, veamos: El funcionamiento de este método es un poco diferente, pero más útil:
  • Primer Parámetro: El componente padre sobre el cual se mostrará la ventana de dialogo.
  • Segundo Parámetro: El mensaje que se mostrará dentro de la ventana.
  • Tercer Parámetro: El mensaje que se mostrará en la barra de titulo.
  • Cuarto Parámetro: Una variable Int contenida por JOptionPane, que representa el icono que se mostrará en la ventana, algunos de los valores posibles son: INFORMATION_MESSAGE , WARNING_MESSAGE , QUESTION_MESSAGE , PLAIN_MESSAGE, ERROR_MESSAGE
En el caso anterior, el mensaje se vería de esta manera: Captura4Como ven, los textos corresponden a los mensajes que se muestran, y al usar un WARNING_MESSAGE se presenta con un icono de alerta. Ahora bien, para el último método, vamos a necesitar crear un icono personalizado, para esto, yo me e descargado una imagen de 50×50 que se llama “icon-pencil-png.png” y la e colocado en un paquete llamado resources dentro de mi proyecto, lo siguiente, será crear un icono, para esto, vamos a crear una clase llamada MyIcon que implemente la interfaz Icon, el contenido de la clase será el siguiente: Listo, con esto tendremos nuestro icono, ya se, tanto rollo para un icono, pero bueno, somos programadores, ahora bien, necesitaremos, antes de mostrar nuestro mensaje de dialogo, crear una instancia de esta clase, y posteriormente, podremos utilizar el método de 5 parametros: Si se dan cuenta, los parámetros son idénticos a los parámetros que se la pasan al método de cuatro parámetros, solo que esta vez, existe un quinto parámetro, que nos permite enviar un icono, proporcionando un resultado similar al siguiente: Captura5Y listo, tenemos una manera coqueta de hacer mensajes de alerta con el showMessageDialog 😉

showInputDialog

Bien, para trabajar con el showInputDialog, vamos a crear nuevamente una clase a la cual le llame InputDialog nuevamente con un método main: Bien, de antemano les digo que nuevamente necesitaremos el import, así que despues de agregarlo comenzaremos a trabajar, y esta vez lo haremos más rápido ya que despues de leer la primera parte, habrán comprendido como está la dinámica de los dialogos. El inputDialog contiene 6 sobrecargas del método, los cuales tienen los siguientes parametros y ojo, TODOS (Con excepción del ultimo) devuelven un String:
  • Método 1:
Explicación: Bueno, este es el método más sencillo, sólo requiere de un parámetro, y este es el mensaje que va a mostrar, como les comente en un principio, la mayoria de los InputDialog devuelven un String, por consecuente, su utilización sería la siguiente: De esta manera, tendríamos un resultado como: input1    
  • Método 2:
Explicacion: Nuevamente el método es sumamente sencillo, dado que su utilización quedaría de esta manera: Quedando el resultado de esta manera: input2  
  • Método 3:
Explicacion: Este método es muy similar al primero, la única diferencia es que este nos permite ubicar el InputDialog sobre un componente, en este caso su utilización sería solo remplazar el primer parametro por el componente o null si no existe un componente: El resultado sería el mismo que el del método 1: input1
  • Método 4:
Explicación: Este método es muy similar al anterior, muy sencillo de entender, el padre, el mensaje que dirá el cuadro de dialogo y por último, un texto por defecto, con un uso como el siguiente: Nos proporcionará un resultado similar al del método 2: input2
  • Método 5:
Explicación: Este método es algo diferente a los anteriores, aunque también incluye el padre, el segundo parámetro representará el texto del cuadro de texto y el tercero el título de la ventana, por ultimo, tenemos la posibilidad de enviar un parámetro tal y como lo hicimos en el showMessageDialog para seleccionar un icono por defecto, un ejemplo de uso sería: Dando un resultado como el siguiente: input4
  • Método 6:
Explicación: Este es mi favorito, este método tiene algo en particular independientemente de las opciones por default, y es que, pasandole como parametro un arreglo de objetos, que también podemos hacer con los métodos anteriores, este método genera un JComboBox para mostrar las posibles selecciones, es algo que me gusta, y encima de todo, nos permite pasar un icono, por ejemplo, voy a utilizar el icono que hicimos anteriormente para el mismo ejemplo: Con este pequeño código, tendríamos un resultado muy similar al siguiente: input5 Excelente presentación para un cuadro de dialogo 🙂

showConfirmDialog

Una vez que hemos dominado los métodos anteriores, utilizar un showConfirmDialog es super sencillo, este, cuenta con cuatro sobrecargas del método, y los veremos de manera super rápida, para esto hagamos una clase con cualquier nombre (en mi caso showConfirmDialog) y pongamosle un método main para comenzar a trabajar, y veamos como funcionan estos métodos:
  • Método 1:
Este es muy sencillo, el componente padre pues como anteriormente mencionamos es aquel sobre el cual se mostrará el mensaje, y el mensaje es lo que dirá el mensaje, como es un dialogo de confirmación, este, por default mostrará las opciones si, no y cancelar, y devolverá un entero con la opción seleccionada como si estuvieramos en un vector, es decir, si seleccionamos si retornará un cero, si es no un 1 y si es cancelar un 2, por ejemplo: De esta manera tendríamos un resultado como el siguiente: confirm1
  • Método 2:
Este componente es un poco mas completo, las primeras dos opciones  son las mismas que el método anterior, pero agregamos tal y como antes el titulo de la ventana, y un parámetro nuevo, el tipo de selección, es decir, que tipo de dialogo será, si es un dialogo de si y no, o si tiene las opciones si, no y cancelar por defecto, por ejemplo: confirm2 Los posibles valores son YES_NO_OPTION o YES_NO_CANCEL_OPTION, sencillitos.
  • Método 3:
Bueno, este método es identico al anterior, solo que se le agrega el tipo de mensaje para que nos reconozca un icono por defecto, tal y como lo hicimos con el InputDialog y el MessageDialog, por ejemplo: Teniendo un resultado como el siguiente, como pueden ver, las variables que utilizamos en los métodos del JOptionPane siempre son casi las mismas, si estan siguiente este tutorial paso a paso, a este punto ya lo deben estar viendo super fácil, el código del método anterior sería el siguiente: confirm3
  • Método 4:
Y el que nos faltaba, el método al cual podemos pasarle un icono personalizado simplemente por estética, veamos un ejemplo con el mismo icono que programamos al principio: Teniendo un resultado muy similar a los anteriores y funcionando igual que todos los showConfirmDialog como pueden observar: confirm4

showOptionDialog

El método anterior, nos enseño una manera de darle a escoger al usuario mas de una opción en una ventana de dialogo, como una manera más personalizada de hacer esto, podemos utilizar el método showOptionDialog que nos proporciona JOptionPane, este método no tiene sobrecarga y cuenta con los siguientes parámetros. Los únicos que hay que dejar en claro después de leer este post son el tipo de selección, que utilizamos un tipo de seleccion como el del showConfirmDialog, el tipo de mensaje que ya sabemos cual es, y las opciones, que es un arreglo con las opciones que se le mostraran al usuario y por ultimo, el valor por default, cabe destacar, que este método, devuelve un valor en int del valor que haya seleccionado el usuario,  veamos un ejemplo de esto: Ok explicación, el icono sabemos que es de la clase que anteriormente utilizamos, el arreglo de opciones son las que se van a mostrar en la ventana, el primer parametro que le mando es null, precisamente por que lo estoy corriendo en una clase con método main sin JFrame y no hay componente padre, posteriormente envío el mensaje que quiero que aparezca dentro del cuadro de dialogo, luego el titulo, luego le mando un DEFAULT_OPTION solo para que trate al cuadro de dialogo como un cuadro normal, un QUESTION_MESSAGE que en realidad no tiene sentido a menos que en el icono enviemos null, por tanto, no tiene caso el parámetro, luego paso el icono personalizado que quiero que tenga mi mensaje de dialogo, el arreglo de opciones y la opción por defecto, el cual, me daría un resultado como el siguiente: Captura   Teniendo en cuenta lo anterior, esto significa, que si selecciono la opcion C por ejemplo, el valor entero que me devolverá el método será 2, por que es la posición 2 del arreglo que enviamos como parámetro,  y lo mismo con las otras opciones. Como verán, es muy sencillo crear cuadros de dialogo en Java, solo hay que conocer esta pequeña clase, posteriormente, blogueare algo más llamativo, como crear cuadros de dialogo personalizados con la clase JDialog de Java, para esto, dedicaré una entrada completa, espero les sea de ayuda. Saludos.

Quizá también te interese

Utilizando ES6 en tus aplicaciones Node
Creando dialogos personalizados en Java con JDIalog
Creando dialogos personalizados en Java con JDIalog
ECMAScript 6, lo nuevo.
Bower, un administrador de paquetes para la web
  • Carlos Zúñiga

    Gracias, muy útil y sencillo 🙂

    • atxy2k

      De nada, espero te haya sido de utilidad.

      • jhosmar

        hola buenas un favor alguien tubiera el codigo de un
        juego

  • Argimiro Cruz

    Que tal amigo, esta muy bien tu explicación, la verdad soy nuevo en java y no se muy bien como implementarlo, pero como podría hacerlo para que al cerrar la ventana me salga el cuadro de dialogo si deseo cerrar o no la ventana, me parece que este codigo es el que se adapta, pero como podría incrustarlo en el software?

    int resp = JOptionPane.showConfirmDialog(null, “¿Esta seguro?”, “Alerta!”, JOptionPane.YES_NO_OPTION);

    • Nicolás Acuña’Cid

      yo lo hice de esta manera

      int resp = JOptionPane.showConfirmDialog(null, “¿Deseas Eliminar Este Examen?”, “Eliminacion De Examenes”, JOptionPane.YES_NO_OPTION);
      if(resp != 1){

      aqui pones lo que quieras hacer si la respuesta es SI
      }else{
      y aqui va lo contrario si esque la respuesta seria NO
      }

      • David Chan

        Wooow! Gracias por los mensajes de dialogo, pero este código le dio el toque final, es genial Nicolás!

      • Juan

        Gracias también sirve hacerlo por un switch:

        switch(resp){
        case JOptionPane.YES_OPTION:
        codigo
        break;
        case JOptionPane.NO_OPTION:
        codigo
        break;
        case JOptionPane.CANCEL_OPTION:
        codigo
        break;
        default:
        codigo
        break;

        }

  • Johnatan Bustamante

    Muy buen aporte, practico y fácil de aplicar, muchas gracias, espero que sigas aportando mucho mas a este amplio mundo de la programación.

    • atxy2k

      Muchas gracias, y claro que si, para eso estamos 😀

  • Mariano

    Esta genial la explicacion, pero no se como podría poner un mensaje para un valor y otro para otro, es decir, por ejemplo: si eres mayor de 18, has ganado y si eres menor, has perdido.

    Gracias!!

    • atxy2k

      Bueno mariano, ahi lo único que te tocaría hacer seria condicionar el String, obteniendo con un InputDialog la respuesta del usuario, luego validando, y por ultimo mostrando tu mensaje.

  • Javier Pérez

    ¡Excelente, eres el mejor, viejo!

  • Isaac

    Hola, una pregunta, como puedo quitar la opción de cerrar por medio de la x roja de la esquina superior derecha ? Lo que quiero es que cierre cuando se seleccione si o no en un JOptionPane.showOptionDialog
    Gracias 😉

  • Patricio

    Hola te puedo hacer una consulta?? Sabes estoy trabajando en un proyecto y estoy usando mensajes con joptionpane y en algun momento la ventana del mensaje cambio su forma y ahora se parece mas a las de windows ,son mas redondeadas y no tan cuadradas como las que venia mostrando. Pero esto paso sin que me diera cuenta, o sea si hice algo para que cambiara la forma de las ventanas no me di cuenta,Tenes alguna idea?

    • Mxrck

      Hola que tal, normalmente en Java Swing se manejan los llamados “Look And Feel” , por defecto Swing usa “Metal” aunque ha cambiado por “Nimbus”, pero también puede usar el look and feel por defecto del sistema.

      Si estás usando Netbeans por defecto a tus ventanas agrega un método “public static void main” donde define el look and feel a usar.

  • Dvash kazhu

    Hola, Antes de todo muchas gracias por tu aporte… hice el codigo para mi trabajo… pero cuando pongo en “run” carga pero no se ven los botones, tengo q pasar el mouse para que aparescan y la imagen no sale ni los msjs… creo que se pone lento…me podrian ayudar

    • Buen día Dvash Kazhu, gracias por tu comentario, habría manera de que me compartas tu proyecto via email o github? … para darle una revisada y apoyarte de mejor manera?

  • Lucho

    Buenas Ivan. Antes que todo, gracias por la explicación del los pane! Y segundo… estoy usando el ShowConfirmDialog YES_NO_OPTION. Necesito hacer que haga tal cosa si elige “SI” y otra cosa si elige “NO”. Como obtengo el resultado de las opciones?

    • Mxrck

      Hola que tal, te respondo tu pregunta, al usar el YES_NO_OPTION puedes asignarlo a una variable entera:

      saludos.

      • Lucho

        Justo entre aca otra vez para aclarar que ya habia podido jaja. Igualmente gracias por la respuesta!

  • Frankling Traña Fierro

    Hola muy buen aporte pero la clase ahi la defines para una sola imagen que pasa si lo quiero hacer dinamico osea yo mandarle cualquier ruta de una imagen y que me la muestre. saludos!

    • Frankling Traña Fierro

      ya encontre otra manera un poco mas facil se podria decir

      int opc = JOptionPane.showConfirmDialog(this, “mensaje”, “titulo”, JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE,new ImageIcon(“src/sigi/icons/cargo.png”));

  • Lucho

    Buenas, tengo un problemita con el JOptionPane.YES_OPTION. Elijo la opcion “YES”, hace lo que tiene que hacer pero despues se va a otra pagina “no result”. Que podre poner para que se quede en la página anterior?

  • Jose

    Simplemente EXCELENTE. Gracias

  • gracias, super util y muy bien explicado

  • Hace falta un InputDialog que permita cambiar el icono. Por ejemplo poner una lupita y que el cuadro de texto lea un dato de busqueda. 🙂 de resto, Explicado de forma excelente.

  • Omar Topasio Chavez Anaya

    Disculpa, quiero utilizar JOptionPane.showInputDialog(); para ingresar valores numericos enteros (int).

    Quisiera saber si hay un metodo para hacer esto posible ya que al momento de ingresar valores int marca error, pues la estructura solo admite String.

    Ayuda, por favor. 🙂

    • Hola que tal, pues realmente, puedes introducirle lo que gustes al InputDialog, solo que siempre, te va a devolver un string, lo que debes de hacer en esta situación, si quieres guardarlo en una variable entera, es parsearlo. Por ejemplo

      De esta manera el resultado se transformaria en un entero, así mismo, considera meter un trycatch, dado que cuando el parseInt no logra transformar el texto en un entero, lanza un error.

  • Abraham morales

    amigo esta muy bueno su articulo sobre los JOptionPane, pero el metodo 6 tambien me gusto bastante, y seria mas interesante al pasarle las carrereas desde una db…. me podria orientar. gracias

  • Fernando FeN

    Pregunta: He intentado usar el JOptionPane.showInputDialog con opciones despegables, me sale perfecto, muy bien, el problema está en que no sé cómo hacer para que cuando el usuario elija una, ésta te dé los pasos de la opción que el usuario eligió. Lo he intentado con “if” como se hace con JOptionPane.showOptionDialog, pero no he podido lograrlo. ¿Podría guiarme alguien por favor?

  • Daniel

    DE LO MEJOR………… MUY BUENA PAGINA, EXCELENTES EJEMPLOS.
    Gracias 🙂

  • Andres F.

    Gracias Me Ha Servido Demasiado Su Explicacion 😀

  • Andres F.

    Me Gusto Su Forma De Explicar Es Bastante Grafica y Muy Dinamica La Forma De Explicar Bastante Sencilla Para Nosotros Los Principiantes 🙂

  • David López Peña

    Hola, tengo un problema, la verdad nunca había implementado la interfaz Icon y me sale el siguiente error.

    • Hola David, por lo que logro ver, tew hace falta un punto antes de getImage(), creo que ese es el problema.

      • David López Peña

        Era eso, muchas gracias 😀

        • Excelente, saludos. 🙂

          • David López Peña

            Un último favor :c

          • Desde que actualizamos el blog no me habia fijado que se desalinearon las imagenes xD …. tienes ese error, por que el número de parametros que estas pasando, no es el adecuado, necesitas pasar dos parametros más en esa funcion por lo que alcanzo a ver ( es que no tengo el netbeans a la mano), necesitas pasarle un array y el elemento que está seleccionado por defecto, intenta pasarle, null en los ultimos parámetros y nos comentas los resultados.

          • David López Peña

            Todo bien hasta que…

          • Pues hoy si que, como dice allá, MyIcon, linea 13, tienes que revisar,a lo mejor no estás cargando algo y llega con valor nulo.

          • David López Peña

            Ya me funcionó, cambie el formato de la imagen a jpg y puse los parámetros del arreglo y del int por defecto. Muchas gracias 🙂

          • Excelente, un placer ser de ayuda, saludos.

          • De nada para eso estamos.

          • jorge jinete

            ¿Que hicistes?

            tenemos el mismo error porfavor pon el codigo completo seria de gran ayuda

    • Jazmin Sanchez Mexicano

      Hola David López Peña me podrías ayudar proporcionándome tu código por favor!!!
      te lo agradeceria mucho…
      Saludos.

  • Miguel Sandoval

    hola buenas una pregunta, existe alguna manera de que el JOptionPane.showOptionDialog me tire la lista de los elementos de manera vertical en vez de horizontal, si conoces alguna manera de colocar el menu de opciones de manera vertical te agradeceria tu respuesta.

    • Hola, que tal, no tengo conocimiento de que el api de JOptionPane tenga esa posbilidad, sin embargo desde mi punto de vista, no se me hace una caracteristica usable, no es algo común para el usuario trabajar con interfaces de ese estilo, ¿que estás intentando hacer?, a lo mejor podemos orientarte.

  • Manuel Solórzano

    alguien me puede decir como subir una imagen a netbeans?

    • Mxrck

      Hola que tal, que necesitas hacer exactamente?

    • JL JL

      Que tal Manuel, solamente tienes que copiar y pegar en la carpeta previamente creada que quieres utilizar dentro de la carpeta de tu proyecto

  • Kevin S

    Me ayudó demasiado, gracias por la información

  • Pingback: Creando dialogos en Java | Ser Programador.es()

  • Juan Jose Duque Cardona

    En verdad es muy util muchas gracias.. pero una pequeña pregunta : es posible hacer un input dialog con varios textfield?

    me explico mejor de esta manera :

    que tenga dos cajones para introducir valores, ya que normal mente solo muestra un cajon o campo para introducir datos

  • Jose Rosero

    En el metodo para personalizar el icono me manda muchos errores y lo copie igual; como ago

  • Malex RM

    que tutorial tan buenisimo y bien explicado….. pregunta….
    en esas ventanas en un ejercicio que hice de mostrar los numeros impares de entre la cantidad de 300…. ya logre que los mostrara pero se hace una ventana horizontal o vertical que no cabe en la extension de la pantalla…. hay alguna solucion para que se muestre en la ventana pero a dos columnas o filas o la cantidad necesaria que se puedan visualizar todas?
    gracias

  • TaviO Cr

    no entiendo a que se refiere con “componente padre” podrias darme un ejemplo te lo agradeceria mucho

    • Es algo muy sencillo, el componente padre, es aquel que contiene al componente actual, por ejemplo, dentro de un iframe, tenemos un jcombobox y jbutton, el padre del jbutton y del jcombobox, es el iframe.

  • jhon betancourt

    https://uploads.disquscdn.com/images/c707ebabf333099dc2e689ba6fd3bb87ada44fe76d3a203be8b7e83ed2b3e374.png
    (con este método)
    ME PODRÍAN DECIR POR QUE CUANDO PONGO UN CONDICIONAL A UNA DE LAS OPCIONES NO LAS LEE,
    COMO SE HACE.

  • David Segura

    Gracias, me ha sido de utilidad, me esta pareciendo bastante interesante este lenguaje.

  • frank

    hola buenas noches
    como hago para hacer suma resta multiplicacion y divison

  • frank

    hola buenas noches como hago para hacer suma resta multiplicacion y division. gracias espero pronto tu ayuda

  • alex gonzales

    pregunta… como le puedo poner color al fondo de esos mensajes se puede o no se puede???

  • Luis Rom

    orale que bien, esta muy sencillo y facil de hacer, muchas gracias por compartir

  • Genesis Chimbo

    como hago el showInputDialog con una imagen?

  • Genesis Chimbo

    Como hago el menú despegable con un switch?