TRUCOS JAVA
Uso de la clase JOptionPane
JOptionPane: es una clase pblica. De apariencia compleja, por la gran cantidad de
mtodos, todos los usos de esta clase son llamados en lnea a un mtodo static showXxxDialog:
showMessageDialog Le muestra al usuario un mensaje showInputDialog Espera por alguna entrada showConfirmDialog Confirma una pregunta, como si/no/cancel. showOptionDialog La unificacin de los tres anteriores.
JOptionPane, facilita el mostrar una ventana emergente en Java o tambin se usa para pedir un valor a los usuarios o informarles de algo.
Para hacer uso de la clase JOptionPane se debe de importar la siguiente librera: import [Link];
showMessageDialog [Link]();
Sintaxis: [Link](un_componente_padre,mensaje,titulo,iconos) Saca el mensaje centrado en un_componente_padre. Si ponemos this te centra en la barra de ttulo.
Usos: //ttulo e icono por defecto [Link](null,"Texto del mensaje."); //ttulo personalizado, icono de pregunta [Link](null, "Texto del mensaje.",
"Ttulo del marco o ventana", JOptionPane.QUESTION_MESSAGE);
//ttulo personalizado, icono de informacin [Link](null, "Texto del mensaje.", "Ttulo del marco o ventana", JOptionPane.INFORMATION_MESSAGE);
//ttulo personalizado, icono de aviso [Link](null, "Texto del mensaje.", "Ttulo del marco o ventana", JOptionPane.WARNING_MESSAGE); //ttulo personalizado, icono de error [Link](null, "Texto del mensaje.", "Ttulo del marco o ventana", JOptionPane.ERROR_MESSAGE); //ttulo personalizado, sin icono [Link](null, "Texto del mensaje.", "Ttulo del marco o ventana ", JOptionPane.PLAIN_MESSAGE);
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.
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:
[Link]()
Tenemos un mtodo [Link]() que nos muestra la ventana ms configurable de 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 enJOptionPane: 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 enoptionType. initialValue: Seleccin por defecto. Debe ser uno de los Object que hayamos pasado en el parmetro options. Se puede pasar null. La llamada a [Link]() 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 int seleccion = [Link]( unComponentePadre, "Seleccione opcion", "Selector de opciones", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, unIcono, // null para icono por defecto. new Object[] { "opcion 1", "opcion 2", "opcion 3" }, YES, NO y CANCEL "opcion 1");
// null para
if (seleccion != -1) [Link]("seleccionada opcion " + (seleccion + 1));
y la ventana que se obtiene con el cdigo anterior
[Link]()
Tenemos varios mtodos [Link]() 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, // Con caja de texto String seleccion = [Link]( unComponentePadre, "Input dialog", JOptionPane.QUESTION_MESSAGE); // el icono sera un iterrogante [Link]("El usuario ha escrito "+seleccion);
y la imagen que obtenemos con este cdigo
En este segundo ejemplo, damos todas las opciones que queremos, obteniendo un JComboBox // Con JCombobox Object seleccion = [Link]( unComponentePadre, "Seleccione opcion", "Selector de opciones", JOptionPane.QUESTION_MESSAGE, unIcono, // null para icono defecto new Object[] { "opcion 1", "opcion 2", "opcion 3" }, "opcion 1"); [Link]("El usuario ha elegido "+seleccion);
y esta es la imagen que se obtiene.
[Link]()
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 [Link]( componentePadre, "Un aviso puetero"); [Link]("ya estas avisado");
y la imagen que muestra este cdigo
[Link]()
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 int confirmado = [Link]( componentePadre, "Lo confirmas?");
if (JOptionPane.OK_OPTION == confirmado) [Link]("confirmado"); else [Link]("vale... no borro nada...");
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 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 package [Link]; import [Link]; import [Link]; import [Link]; /**
* Muestra un JOptionPane con un timeout para que se cierre automaticamente. * * @author chuidiang * */ public class JOptionPaneConTimeOut { private static JOptionPane option = new JOptionPane("", JOptionPane.INFORMATION_MESSAGE); private static JDialog dialogo = null; /** * Solo hace caso a padre la primera vez que se llama a este mtodo. La * llamada a este metodo se queda bloqueada hasta que el usuario cierra el * JOptionPane o pasa el timeout. * * @param padre * @param texto * @param titulo * @param timeout * En mili segundos */ public static void visualizaDialogo( Component padre, String texto, String titulo, final long timeout) { [Link](texto); if ( null == dialogo ) { dialogo = [Link](padre, titulo); } else { [Link](titulo); } Thread hilo = new Thread() { public void run() { try { [Link](timeout); if ( [Link]() ) {
[Link](false); } } catch ( InterruptedException e ) { [Link](); } } }; [Link](); [Link](true); } }
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 private static JOptionPane option = new JOptionPane("",JOptionPane.INFORMATION_MESSAGE);
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 pueden cambiar estos parmetros usando los mtodos set al efecto [Link](texto);
Creamos el dilogo slo la primera vez que se llama al mtodo con dialogo = [Link](padre, titulo);
El ttulo es el de la ventana (del JDialog) y podemos cambiarlo cuando queramos con [Link](titulo);
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 [Link]() 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 [Link](); [Link](true);
Si el dilogo tuviera opciones que nos interesan, despues de [Link](), podemos obtener la opcion seleccionada con Object valor = [Link]();
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 JDialogmodales. 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: package [Link].option_pane_dialog_modal;
import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; /** * Dialogo modal que sirve de ventana de captura de datos.<br> * Contiene un JTextField en el que escribimos un texto y pulsando enter despus * de escribir en el, la ventana se cierra. * * @author Chuidiang * */ public class DialogoModal extends JDialog { private JTextField textField; /** * Constructor que pone titulo al dialogo, construye la ventana y la hace * modal. * * @param padre * Frame que hace de padre de esta dialogo. */ public DialogoModal(Frame padre) { // padre y modal super(padre, true); setTitle("Mete un dato"); textField = new JTextField(20); getContentPane().add(textField); // Se oculta la ventana al pulsar <enter> sobre el textfield [Link](new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { setVisible(false); } }); } /** * Deveulve el texto en el jtextfield *
* @return el texto */ public String getText() { return [Link](); } }
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 DialogoModal dialogoModal = new DialogoModal((Frame) ventanaPadre); [Link](); // para darle tamao automtico a la ventana. [Link](true); // Al ser modal, la llamada a setVisible(true) se queda bloqueada hasta // que el dialogo modal se oculte. Por ello, a continuacin tenemos // la seguridad de que el texto ya esta disponible. [Link]("El usuario ha escrito "+[Link]()); Categora: Java:SWING