Está en la página 1de 9

25/09/13

JOptionPane y dilogos modales - ChuWiki

JOptionPane y dilogos modales


Tw ittear

De ChuWiki

Contenido
1 Introduccin JOptionPane y Dilogos modales 2 JOptionPane 2.1 JOptionPane.showOptionDialog() 2.2 JOptionPane.showInputDialog() 2.3 JOptionPane.showMessageDialog() 2.4 JOptionPane.showConfirmDialog() 2.5 JOptionPane con timeout 3 JDialog modal

Introduccin JOptionPane y Dilogos modales


En nuestras aplicaciones Java Swing es bastante habitual que tengamos que pedir al usuario la confirmacin de una accin (por ejemplo, salir de la aplicacin o borrar unos datos), pedirle algn dato sencillo, darle a elegir entre varias acciones o simplemente mostrarle un aviso. A veces es necesario para estas acciones abrir una ventana secundaria donde el usuario debe realizar la accin que sea y cerrarla. Por ejemplo, podemos mostrarle una ventana preguntando algo como "Ests seguro que quieres borrar todos esos datos?" y que tenga un par de botones de "S, estoy seguro" y "No, no creo". Afortunadamente, en java no tenemos que hacer esas ventanas. Para las acciones ms habituales, ya tenemos la clase JOptionPane que muestra esas ventanas por nosotros y nos devuelven la eleccin hecha por el usuario. En otras ocasiones, nos tendremos que hacer una ventana a nuestra medida, pero si usamos un JDialog modal, al menos tendremos la ventaja de que el cdigo esperar a que el usuario introduzca los datos en dicha ventana. Vamos a ver en este artculo ejemplos con JOptionPane y Dilogos modales. En el siguiente enlace puedes ver todo el cdigo detallado de estos ejemplos con JOptionPane y Dilogos modales (http://code.google.com/p/chuidiang-ejemplos/source/browse/#svn/trunk/ejemplosswing/src/main/java/com/chuidiang/ejemplos/option_pane_dialog_modal) .

JOptionPane
JOptionPane tiene dos juegos repetidos de ventanas de aviso/confirmacin. Una para ventanas normales y otra para JInternalFrame. Puesto que son lo mismo, vamos a ver aqu slo los de ventanas normales. Las distintas posibilidades que tenemos de JOptionPane son:

JOptionPane.showOptionDialog()
Tenemos un mtodo JOptionPane.showOptionDialog() que nos muestra la ventana ms configurable de
chuwiki.chuidiang.org/index.php?title=JOptionPane_y_dilogos_modales 1/9

25/09/13

JOptionPane y dilogos modales - ChuWiki

todas, en ella debemos definir todos los botones que lleva. De hecho, las dems ventanas disponibles con JOptionPane se construyen a partir de esta. Por ello, al mtodo debemos pasarle muchos parmetros: parentComponent: A partir de este componente, se intentar determinar cual es la ventana que debe hacer de padre del JOptionPane. Se puede pasar null, pero conviene pasar, por ejemplo, el botn desde el cual se lanza la accin que provoca que se visualice el JOptionPane. De esta manera, la ventana de aviso se visualizar sobre el botn y no se podr ir detrs del mismo si hacemos click en otro sitio. message : El mensaje a mostrar, habitualmente un String, aunque vale cualquier Object cuyo mtodo toString() devuelva algo con sentido. title : El ttulo para la ventana. optionType : Un entero indicando qu opciones queremos que tenga la ventana. Los posibles valores son las constantes definidas en JOptionPane: DEFAULT_OPTION, YES_NO_OPTION, YES_NO_CANCEL_OPTION, o OK_CANCEL_OPTION. messageType : Un entero para indicar qu tipo de mensaje estamos mostrando. Este tipo servir para que se determine qu icono mostrar. Los posibles valores son constantes definidas en JOptionPane: ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE, o PLAIN_MESSAGE icon: Un icono para mostrar. Si ponemos null, saldr el icono adecuado segn el parmetro messageType. options : Un array de objects que determinan las posibles opciones. Si los objetos son componentes visuales, aparecern tal cual como opciones. Si son String, el JOptionPane pondr tantos botones como String. Si son cualquier otra cosa, se les tratar como String llamando al mtodo toString(). Si se pasa null, saldrn los botones por defecto que se hayan indicado en optionType. initialValue : Seleccin por defecto. Debe ser uno de los Object que hayamos pasado en el parmetro options. Se puede pasar null. La llamada a JOptionPane.showOptionDialog() devuelve un entero que representa la opcin que ha seleccionado el usuario. La primera de las opciones del array es la posicin cero. Si se cierra la ventana con la cruz de la esquina superior derecha, el mtodo devolver -1. Aqu un ejemplo de cmo llamar a este mtodo 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 i n ts e l e c c i o n=J O p t i o n P a n e . s h o w O p t i o n D i a l o g ( u n C o m p o n e n t e P a d r e , " S e l e c c i o n eo p c i o n " , " S e l e c t o rd eo p c i o n e s " , J O p t i o n P a n e . Y E S _ N O _ C A N C E L _ O P T I O N , J O p t i o n P a n e . Q U E S T I O N _ M E S S A G E , u n I c o n o , / /n u l lp a r ai c o n op o rd e f e c t o . n e wO b j e c t [ ]{" o p c i o n1 " ," o p c i o n2 " ," o p c i o n3 "} , " o p c i o n1 " ) ;
?

/ /n u l lp a r aY

i f( s e l e c c i o n! =1 ) S y s t e m . o u t . p r i n t l n ( " s e l e c c i o n a d ao p c i o n"+( s e l e c c i o n+1 ) ) ;

y la ventana que se obtiene con el cdigo anterior

chuwiki.chuidiang.org/index.php?title=JOptionPane_y_dilogos_modales

2/9

25/09/13

JOptionPane y dilogos modales - ChuWiki

JOptionPane.showInputDialog()
Tenemos varios mtodos JOptionPane.showInputDialog() y la diferencia entre ellos es que tienen ms o menos parmetros, segn queramos aceptar o no las opciones por defecto. Los parmetros y sus significados son muy similares a los del mtodo showOptionDialog(), pero hay una diferencia. Si usamos los mtodos que no tienen array de opciones, la ventana mostrar una caja de texto para que el usuario escriba la opcin que desee (un texto libre). Si usamos un mtodo que tenga un array de opciones, entonces aparecer en la ventana un JComboBox en vez de una caja de texto, donde estarn las opciones que hemos pasado. Aqu un par de trozos de cdigo, el primero para conseguir una caja de texto, 1 2 3 4 5 6 7
? / /C o nc a j ad et e x t o S t r i n gs e l e c c i o n=J O p t i o n P a n e . s h o w I n p u t D i a l o g ( u n C o m p o n e n t e P a d r e , " I n p u td i a l o g " , J O p t i o n P a n e . Q U E S T I O N _ M E S S A G E ) ; / /e li c o n os e r au ni t e r r o g a n t e

S y s t e m . o u t . p r i n t l n ( " E lu s u a r i oh ae s c r i t o" + s e l e c c i o n ) ;

y la imagen que obtenemos con este cdigo

En este segundo ejemplo, damos todas las opciones que queremos, obteniendo un JComboBox 1 2 3 4 5 6 7 8 9 1 0 1 1 / /C o nJ C o m b o b o x O b j e c ts e l e c c i o n=J O p t i o n P a n e . s h o w I n p u t D i a l o g ( u n C o m p o n e n t e P a d r e , " S e l e c c i o n eo p c i o n " , " S e l e c t o rd eo p c i o n e s " , J O p t i o n P a n e . Q U E S T I O N _ M E S S A G E , u n I c o n o , / /n u l lp a r ai c o n od e f e c t o n e wO b j e c t [ ]{" o p c i o n1 " ," o p c i o n2 " ," o p c i o n3 "} , " o p c i o n1 " ) ; S y s t e m . o u t . p r i n t l n ( " E lu s u a r i oh ae l e g i d o" + s e l e c c i o n ) ;
?

chuwiki.chuidiang.org/index.php?title=JOptionPane_y_dilogos_modales

3/9

25/09/13

JOptionPane y dilogos modales - ChuWiki

y esta es la imagen que se obtiene.

JOptionPane.showMessageDialog()
Esta es la ms sencilla de todas, slo muestra una ventana de aviso al usuario. La ejecucin se detiene hasta que el usuario cierra la ventana. Hay varios mtodos con el mismo nombre y ms o menos parmetros, en funcin de si aceptamos las opciones por defecto (icono, por ejemplo) o queremos cambiar alguna cosa. Un trozo de cdigo para llamarlo
J O p t i o n P a n e . s h o w M e s s a g e D i a l o g ( c o m p o n e n t e P a d r e , " U na v i s op u e t e r o " ) ; S y s t e m . o u t . p r i n t l n ( " y ae s t a sa v i s a d o " ) ;

y la imagen que muestra este cdigo

JOptionPane.showConfirmDialog()
Este mtodo muestra una ventana pidiendo una confirmacin al usuario, estilo "Seguro que lo quieres borrar todo?" y da al usuario opcin de aceptar o cancelar ese borrado masivo que est a punto de hacer. El mtodo devuelve un entero indicando la respuesta del usuario. Los valores de ese entero puede ser alguna de las constantes definidas en JOptionPane: YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION, CLOSED_OPTION. Por supuesto, hay metodos iguales con ms o menos parmetros para configurar las cosas ms o menos. El siguiente ejemplo de codigo
i n tc o n f i r m a d o=J O p t i o n P a n e . s h o w C o n f i r m D i a l o g ( c o m p o n e n t e P a d r e , " L oc o n f i r m a s ? " ) ; i f( J O p t i o n P a n e . O K _ O P T I O N= =c o n f i r m a d o ) S y s t e m . o u t . p r i n t l n ( " c o n f i r m a d o " ) ; e l s e S y s t e m . o u t . p r i n t l n ( " v a l e . . .n ob o r r on a d a . . . " ) ;

chuwiki.chuidiang.org/index.php?title=JOptionPane_y_dilogos_modales

4/9

25/09/13

JOptionPane y dilogos modales - ChuWiki

muestra la siguiente imagen

JOptionPane con timeout


La llamada a cualquiera de los mtodos anteriores para la ejecucin de nuestro programa hasta que el usuario cierre la ventana seleccionando alguna de las opciones. A veces no nos interesa quedarnos bloqueados indefinidamente esperando la respuesta del usuario, por ejemplo, podemos mostrarle un mensaje para informarle de algo con un showMessageDialog() y si en 30 segundos no lo ha cerrado, cerrarlo nosotros automticamente desde nuestro cdigo y continuar con lo que estbamos haciendo. Desgraciadamente, JOptionPane no tiene ninguna opcin con timeout, por lo que hacer esto no es inmediato. Debemos lanzar un Timer (http://www.chuidiang.com/java/timer/timer.php) o un hilo para cerrar la ventana desde ese hilo. Y desgraciadamente, los mtodos que hemos visto de JOptionPane no nos devuelven una referencia a la ventana que acabamos de visualizar, por lo que tampoco podremos ocultarla desde cdigo. La solucin es que creemos nosotros la ventana y nos guardemos una referencia a ella. Afortunadamente, no debemos hacernos la ventana desde cero. Podemos hacer un new de JOptionPane para obtener el panel de dicha ventana y llamar al mtodo createDialog() para obtener y visualizar el JDialog correspondiente. El cdgo completo para esto puede ser como el del ejemplo 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 p a c k a g ec o m . c h u i d i a n g . e j e m p l o s ; i m p o r tj a v a . a w t . C o m p o n e n t ; i m p o r tj a v a x . s w i n g . J D i a l o g ; i m p o r tj a v a x . s w i n g . J O p t i o n P a n e ;
?

/ * * *M u e s t r au nJ O p t i o n P a n ec o nu nt i m e o u tp a r aq u es ec i e r r ea u t o m a t i c a m e * *@ a u t h o rc h u i d i a n g * * / p u b l i cc l a s sJ O p t i o n P a n e C o n T i m e O u t { p r i v a t es t a t i cJ O p t i o n P a n eo p t i o n=n e wJ O p t i o n P a n e ( " " , J O p t i o n P a n e . I N F O R M A T I O N _ M E S S A G E ) ; p r i v a t es t a t i cJ D i a l o gd i a l o g o=n u l l ;

/ * * *S o l oh a c ec a s oap a d r el ap r i m e r av e zq u es el l a m aae s t em t o d o . *l l a m a d aae s t em e t o d os eq u e d ab l o q u e a d ah a s t aq u ee lu s u a r i oc i e *J O p t i o n P a n eop a s ae lt i m e o u t . *


5/9

chuwiki.chuidiang.org/index.php?title=JOptionPane_y_dilogos_modales

25/09/13

JOptionPane y dilogos modales - ChuWiki

2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 6 7

*@ p a r a mp a d r e *@ p a r a mt e x t o *@ p a r a mt i t u l o *@ p a r a mt i m e o u t * E nm i l is e g u n d o s * / p u b l i cs t a t i cv o i dv i s u a l i z a D i a l o g o (C o m p o n e n tp a d r e ,S t r i n gt e x t o , S t r i n gt i t u l o ,f i n a ll o n gt i m e o u t ) { o p t i o n . s e t M e s s a g e ( t e x t o ) ; i f(n u l l= =d i a l o g o) { d i a l o g o=o p t i o n . c r e a t e D i a l o g ( p a d r e ,t i t u l o ) ; } e l s e { d i a l o g o . s e t T i t l e ( t i t u l o ) ; } T h r e a dh i l o=n e wT h r e a d ( ) { p u b l i cv o i dr u n ( ) { t r y { T h r e a d . s l e e p ( t i m e o u t ) ; i f(d i a l o g o . i s V i s i b l e ( )) { d i a l o g o . s e t V i s i b l e ( f a l s e ) ; } } c a t c h(I n t e r r u p t e d E x c e p t i o ne) { e . p r i n t S t a c k T r a c e ( ) ; } } } ; h i l o . s t a r t ( ) ; } d i a l o g o . s e t V i s i b l e ( t r u e ) ;

La clase del ejemplo tiene un mtodo esttico visualizaDialogo() al que podemos llamar para mostrar un aviso que se cierre automticamente si el usuario no lo cierra antes. Esta clase/mtodo es slo de ejemplo y no permite configurar todo lo que se puede configurar en el JOptionPane, no queremos complicar la clase en exceso para esta explicacin. Vamos viendo algunos detalles. Creamos el JOptionPane de esta forma
p r i v a t es t a t i cJ O p t i o n P a n eo p t i o n=n e wJ O p t i o n P a n e ( " " , J O p t i o n P a n e . I N F O R M A T I O N _ M E S S A G E ) ;

es decir, sin texto concreto "", y slo para un mensaje de tipo informacin. Podramos aqu usar cualquiera de los constructores que tiene JOptionPane y poner los parmetros que queramos. En sucesivas llamadas se
chuwiki.chuidiang.org/index.php?title=JOptionPane_y_dilogos_modales 6/9

25/09/13

JOptionPane y dilogos modales - ChuWiki

pueden cambiar estos parmetros usando los mtodos set al efecto


o p t i o n . s e t M e s s a g e ( t e x t o ) ;

Creamos el dilogo slo la primera vez que se llama al mtodo con


d i a l o g o=o p t i o n . c r e a t e D i a l o g ( p a d r e ,t i t u l o ) ;

El ttulo es el de la ventana (del JDialog) y podemos cambiarlo cuando queramos con


d i a l o g o . s e t T i t l e ( t i t u l o ) ;

Lo que no podemos cambiar es el padre, por eso el comentario que aparece de que slo se har caso al parmetro parent en la primera llamada. Una vez configurada la ventana con el ttulo y tal, creamos un hilo con una espera del tiempo indicado y pasado ese tiempo cerramos la ventana. Se comprueba antes si sigue visible, no sea que la haya cerrado el usuario antes de pasar el tiempo indicado. Recordamos arrancar el hilo con hilo.start() y nos aseguramos de hacer esto antes de hacer el dilogo visible, ya que al ser el dilogo modal, la llamada a setVisible(true) quedar bloqueada hasta que se cierre la ventana. Y despus de arrancar el hilo, slo queda hacer visible el dilogo
h i l o . s t a r t ( ) ; d i a l o g o . s e t V i s i b l e ( t r u e ) ;

Si el dilogo tuviera opciones que nos interesan, despues de dialogo.setVisible(), podemos obtener la opcion seleccionada con
O b j e c tv a l o r=o p t i o n . g e t V a l u e ( ) ;

Este valor ser un JOption.UNINITIALIZED_VALUE si el dialogo se ha cerrado por timeout, o bien el valor seleccionado JOptionPane.YES_OPTION, JOptionPane.CANCEL_OPTION, etc, o bien alguno de los Object[] que hayamos usado uno de los constructores que admite Object[] options como parmetro.

JDialog modal
A veces las ventanas de JOptionPane no son suficientes para lo que necesitamos. Por ejemplo, podemos querer pedir un dato ms complejo que una simple seleccin de una opcin. Y a veces mientras el usuario introduce ese dato complejo en la ventana y pulsa "Aceptar", queremos que nuestro cdigo se pare en espera de la respuesta. Para estas situaciones tenemos los JDialog modales. En un JDialog podemos poner todos los componentes que queramos, haciendo la ventana todo lo compleja que queramos. Si ese JDialog es adems modal, en el momento de hacerla visible llamando a setVisible(true), el cdigo se quedar parado en esa llamada hasta que la ventana se cierre. Podemos, por tanto, justo despus del setVisible(true), pedirle a la ventana los datos que ha introducido el operador. Vamos a hacer aqu un ejemplo para ver todo esto. Como no quiero complicar demasiado el JDialog por claridad del ejemplo, el JDialog slo tendr un JTextField dentro de l y al pulsar <intro> en ese JTextField, despus de haber escrito algo, el JDialog se cerrar. El cdigo para conseguir esto es el siguiente:
chuwiki.chuidiang.org/index.php?title=JOptionPane_y_dilogos_modales 7/9

25/09/13

JOptionPane y dilogos modales - ChuWiki

p a c k a g ec o m . c h u i d i a n g . e j e m p l o s . o p t i o n _ p a n e _ d i a l o g _ m o d a l ; i m p o r tj a v a . a w t . F r a m e ; i m p o r tj a v a . a w t . e v e n t . A c t i o n E v e n t ; i m p o r tj a v a . a w t . e v e n t . A c t i o n L i s t e n e r ; i m p o r tj a v a x . s w i n g . J D i a l o g ; i m p o r tj a v a x . s w i n g . J T e x t F i e l d ; / * * *D i a l o g om o d a lq u es i r v ed ev e n t a n ad ec a p t u r ad ed a t o s . < b r > *C o n t i e n eu nJ T e x t F i e l de ne lq u ee s c r i b i m o su nt e x t oyp u l s a n d oe n t e rd e s p u s *d ee s c r i b i re ne l ,l av e n t a n as ec i e r r a . * *@ a u t h o rC h u i d i a n g * * / p u b l i cc l a s sD i a l o g o M o d a le x t e n d sJ D i a l o g{ p r i v a t eJ T e x t F i e l dt e x t F i e l d ; / * * *C o n s t r u c t o rq u ep o n et i t u l oa ld i a l o g o ,c o n s t r u y el av e n t a n ayl ah a c e *m o d a l . * *@ p a r a mp a d r e * F r a m eq u eh a c ed ep a d r ed ee s t ad i a l o g o . * / p u b l i cD i a l o g o M o d a l ( F r a m ep a d r e ){ / /p a d r eym o d a l s u p e r ( p a d r e ,t r u e ) ; s e t T i t l e ( " M e t eu nd a t o " ) ; t e x t F i e l d=n e wJ T e x t F i e l d ( 2 0 ) ; g e t C o n t e n t P a n e ( ) . a d d ( t e x t F i e l d ) ; / /S eo c u l t al av e n t a n aa lp u l s a r< e n t e r >s o b r ee lt e x t f i e l d t e x t F i e l d . a d d A c t i o n L i s t e n e r ( n e wA c t i o n L i s t e n e r ( ){ @ O v e r r i d e p u b l i cv o i da c t i o n P e r f o r m e d ( A c t i o n E v e n ta r g 0 ){ s e t V i s i b l e ( f a l s e ) ; } } ) ; } / * * *D e v e u l v ee lt e x t oe ne lj t e x t f i e l d * *@ r e t u r ne lt e x t o * / p u b l i cS t r i n gg e t T e x t ( ){ r e t u r nt e x t F i e l d . g e t T e x t ( ) ; } }

Le hemos aadido adems un mtodo getText() que devuelve el texto del JTextField. Ser este al mtodo al que llamemos para conseguir el texto introducido por el usuario despus de que se cierre la ventana. Para hacer la llamada a este dilogo y recoger los resultados, usaremos el siguiente cdigo
D i a l o g o M o d a ld i a l o g o M o d a l=n e wD i a l o g o M o d a l ( ( F r a m e )v e n t a n a P a d r e ) ; d i a l o g o M o d a l . p a c k ( ) ; / /p a r ad a r l et a m a oa u t o m t i c oal av e n t a n a . d i a l o g o M o d a l . s e t V i s i b l e ( t r u e ) ; / /A ls e rm o d a l ,l al l a m a d aas e t V i s i b l e ( t r u e )s eq u e d ab l o q u e a d ah a s t a / /q u ee ld i a l o g om o d a ls eo c u l t e .P o re l l o ,ac o n t i n u a c i nt e n e m o s
chuwiki.chuidiang.org/index.php?title=JOptionPane_y_dilogos_modales 8/9

25/09/13

JOptionPane y dilogos modales - ChuWiki

/ /l as e g u r i d a dd eq u ee lt e x t oy ae s t ad i s p o n i b l e . S y s t e m . o u t . p r i n t l n ( " E lu s u a r i oh ae s c r i t o" + d i a l o g o M o d a l . g e t T e x t ( ) ) ;

Obtenido de "http://chuwiki.chuidiang.org/index.php?title=JOptionPane_y_di%C3%A1logos_modales" Categora: Java:SWING Esta pgina fue modificada por ltima vez el 06:41, 26 mar 2013.

Esta obra est bajo una licencia de Creative Commons. Para reconocer la autora debes poner http://www.chuidiang.com/chuwiki

chuwiki.chuidiang.org/index.php?title=JOptionPane_y_dilogos_modales

9/9