Investigacion Sobre Joption Pane
Investigacion Sobre Joption Pane
Investigacion Sobre Joption Pane
OptionPane 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 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 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 int seleccion = JOptionPane.showOptionDialog( 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" }, "opcion 1");
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, // Con caja de texto String seleccion = JOptionPane.showInputDialog( unComponentePadre, "Input dialog", JOptionPane.QUESTION_MESSAGE); // el icono sera un iterrogante System.out.println("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 = JOptionPane.showInputDialog( unComponentePadre, "Seleccione opcion", "Selector de opciones", JOptionPane.QUESTION_MESSAGE, unIcono, // null para icono defecto new Object[] { "opcion 1", "opcion 2", "opcion 3" }, "opcion 1"); System.out.println("El usuario ha elegido "+seleccion);
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 JOptionPane.showMessageDialog( componentePadre, "Un aviso puetero"); System.out.println("ya estas avisado"); 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 cdigo int confirmado = JOptionPane.showConfirmDialog( componentePadre, "Lo confirmas?"); if (JOptionPane.OK_OPTION == confirmado) System.out.println("confirmado"); else System.out.println("vale... no borro nada...");
* @param timeout * En mili segundos */ public static void visualizaDialogo( Component padre, String texto, String titulo, final long timeout) { option.setMessage(texto); if ( null == dialogo ) { dialogo = option.createDialog(padre, titulo); } else { dialogo.setTitle(titulo); } Thread hilo = new Thread() { public void run() { try { Thread.sleep(timeout); if ( dialogo.isVisible() ) { dialogo.setVisible(false); } } catch ( InterruptedException e ) { e.printStackTrace(); } } }; hilo.start(); dialogo.setVisible(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
option.setMessage(texto); Creamos el dilogo slo la primera vez que se llama al mtodo con dialogo = option.createDialog(padre, titulo); El ttulo es el de la ventana (del JDialog) y podemos cambiarlo cuando queramos con dialogo.setTitle(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 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 hilo.start(); dialogo.setVisible(true); Si el dilogo tuviera opciones que nos interesan, despues de dialogo.setVisible(), podemos obtener la opcion seleccionada con Object valor = option.getValue(); 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 asetVisible(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 eseJTextField, despus de haber escrito algo, el JDialog se cerrar. El cdigo para conseguir esto es el siguiente: package com.chuidiang.ejemplos.option_pane_dialog_modal; import java.awt.Frame; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.JDialog; import javax.swing.JTextField; /** * 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 textField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { setVisible(false); } }); } /** * Deveulve el texto en el jtextfield * * @return el texto */ public String getText() { return textField.getText(); } } 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); dialogoModal.pack(); // para darle tamao automtico a la ventana. dialogoModal.setVisible(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. System.out.println("El usuario ha escrito "+dialogoModal.getText());
Int n=120; String s=Integer.toString(n); // s se convierte en 120 Para convertir un float en String
float f=5,4; string s=float.toString(f); //s se convierte en 5,4 Para convertir un String en int:
String s=1234; Int n=Integer.parseInt(s); //Se convierte la cadena 1234 en un int. El mtodo parseInt
El mtodo parseInt devuelve un tipo int. Un uso comn de esto es cuando una cadena de dgitos se obtiene mediante un campo textfield, como por ejemplo:
If (event.getSource() == algunCampoTexto) { N= Integer.parseInt(algunCampoTexto.getText() ); } El mtodo parseFloat Para convertir un String en float, podemos utilizar parseFloat como se muestra a continuacin:
String s=12.34; Float f=Float.parseFloat(s); Clase abstracta number La clase abstracta Number representa una interfaz a todos los tipos escalares estndar: long int float double Number tiene mtodos de acceso que devuelven el valor posiblemente redondeado del objeto de cada uno de los objetos simples: doubleValue() devuelve un double. floatValue() devuelve un float. intValue() devuelve un int. longValue() devuelve un long.
Double y float
Double y Float son subclases de Number. Ambas clases tienen dos constructores para inicializarlas con valores double y float, o, lo que es muy prctico, se pueden inicializar con una representacin tipo String del valor:
Double d1 = new Double(3.14159); Double d2 = new Double("314159E-5"); Integer y long La clase Integer es una envoltura alrededor de int, short y byte. Long es una envoltura alrededor del tipo long. Adems de los mtodos heredados de Number tienen otros muy tiles: parseInt(String) convierte la variable String en el valor int que representa. parseInt(String, base) hace lo mismo que el mtodo anterior, pero especifica una base distinta de la dcima. toString(int) convierte el int que se pasa al mtodo en su representacin como cadena. toString(int, base) igual al anterior, pero puedo cambiar de base.
1. Lo primero que haremos ser crear un proyecto nuevo en NetBeans al que titularemos 'AspectoFrame'.
2. Adems del paquete que nos crea por defecto agregaremos uno de nombre 'img' en el cual almacenaremos las imgenes que vamos a utilizar para personalizar la barra. Definir el aspecto de la ventana
1. Dentro del paquete principal vamos a crear una nueva ventana JFrame dando clic derecho sobre el paquete > Nuevo > JFrame y la llamaremos 'Ventana'. 2. Posteriormente editamos sus propiedades (desde la ventana de Propiedades del lado derecho o dando clic derecho sobre la ventana y seleccionando Propiedades en el men emergente) y marcamos la propiedad 'undecorated'. 3. Ahora vamos a la paleta y tomamos un JPanel, mismo que arrastramos a nuestra ventana y lo colocamos en la parte superior. Luego cambiamos el tamao para que ocupe todo el ancho de la ventana y una alto parecido al del ttulo que las ventanas tienen normalmente. 4. Posteriormente editamos las propiedades del Panel para cambiar su color de fondo el que se desee, en mi caso, azul. Tras realizar lo anterior tendremos algo parecido a lo siguiente:
5. Una vez realizado lo anterior debes buscar 3 imgenes que nos ayudarn a simular los botones de Cerrar, Maximizar y Minimizar de la ventana, deben de ser de aprox. 15x15 px. Cuando las encuentres debes copiarlas en el paquete 'img' que creamos dentro del proyecto. 6. Ya con las imgenes dentro del paquete agregamos una etiqueta del lado derecho del panel y borramos el texto que contenga. 7. A la etiqueta agregada anteriormente le colocamos la imagen que utilizaremos para simular el botn de Cerrar dando clic derecho sobre la etiqueta > Propiedades > Icon, seleccionamos 'Imagen dentro de
9. El ltimo elemento que agregaremos ser la etiqueta que mostrar el ttulo de la ventana, lo anterior lo haremos colocando una etiqueta dentro del panel que ocupe todo el espacio restante entre los botones y el lado izquierdo de la barra. 10. Una vez agregada la etiqueta cambiamos el tipo, tamao y color de fuente a nuestra preferencia para que nos quede algo as...
Arrastrar la ventana... Para agregar la posibilidad de arrastrar la ventana lo primero que tenemos que hacer es localizar su ubicacin en la pantalla en un momento dado, en este caso, al hacer click sobre el panel que sustituir la barra de ttulo. Para ello definiremos las variables x,y de tipo entero a nivel de clase de la siguiente manera: private int x; private int y; Posteriormente damos un click derecho sobre el Panel > Eventos > MousePressed y agregamos el siguiente cdigo al mtodo que se nos gener:
x = evt.getX(); y = evt.getY(); Ahora damos nuevamente click derecho sobre el Panel > Eventos > MouseDragged y agregamos el cdigo que nos permitir arrastrar la ventana: Point ubicacin = MouseInfo.getPointerInfo().getLocation();//1 System.out.println("Coordenadas: ("+ubicacion.x+","+ubicacion.y+")");//2 setLocation(ubicacion.x - x, ubicacion.y - y);//3 Primeramente obtenemos la ubicacin del puntero [1], posteriormente la mostramos en consola [2] con el fin de ver cmo se comporta y por ltimo establecemos la nueva ubicacin de la ventana [3]. Cerrar, Maximizar / Restaurar, Minimizar... Para agregar la accin de Cerrar la ventana damos click derecho sobre la etiqueta que tiene la imagen correspondiente y seleccionamos Eventos > Mouse > MouseClicked. Dentro del mtodo generado por NetBeans agregamos una llamada al mtodo dispose() para cerrar la ventana.
private void lbCerrarMouseClicked(java.awt.event.MouseEvent evt) { dispose(); } Posteriormente damos clic derecho sobre la etiqueta que har las veces de Maximizar / Restaurar la ventana y seleccionamos Eventos > Mouse > MouseClicked. Dentro del mtodo generado por NetBeans agregamos una llamada al metodo restaurarVentana() que crearemos posteriormente... private void lbRestaurarMouseClicked(java.awt.event.MouseEvent evt){ } Y una vez hecho esto creamos el mtodo... private void restaurarVentana() { if(getExtendedState() == JFrame.MAXIMIZED_BOTH){//1 setExtendedState(JFrame.NORMAL);//2 }else{ setExtendedState(JFrame.MAXIMIZED_BOTH);//3 } } restaurarVentana();
Lo primero que hacemos es verificar el estado actual de la ventana [1], en caso de que est maximizada la retornamos a su estado normal [2], en caso contrario la maximizamos [3].
Lo siguiente que haremos ser agregar el evento MouseClicked a la etiqueta que tiene la imagen que minimizar la ventana y dentro del mtodo generado agregamos el siguiente cdigo. setExtendedState(JFrame.ICONIFIED); Maximizar / Restaurar con doble click... Para poder maximizar la ventana al dar doble clic sobre el panel de ttulo de la misma debemos dar click derecho sobre el panel > Eventos > MouseClicked y dentro del mtodo agregamos el siguiente cdigo: if(evt.getClickCount() == 2){//1 restaurarVentana();//2 } Lo primero que hacemos es verificar la cantidad de click's que se dieron sobre el panel[1], en caso de ser 2 hacemos una llamada al mtodo restaurar Ventana() [2] que definimos previamente. Agregar el ttulo a la ventana... Ahora vamos a sobrescribir el mtodo setTitle() del JFrame para que establezca el ttulo de la ventana, para ello nos vamos a la vista del cdigo fuente y agregamos el siguiente cdigo... public void setTitle(String title) { super.setTitle(title); lbTitulo.setText(title); } En este caso lo nico que hacemos es establecer el ttulo en la etiqueta que definimos para ello luego de llamar al mtodo setTitle() original. Hacer visible la ventana... Para visualizar la ventana al ejecutar la aplicacin debemos agregar el siguiente cdigo en el constructor por defecto: setTitle("Mi ventana personalizada");//1 setLocationRelativeTo(null);//2 setVisible(true); //3 Lo primero que hacemos es establecer un ttulo a la ventana [1], luego la centramos [2] y por ltimo la hacemos visible [3]. Para que podamos ver nuestra ventana en operacin debemos ir a nuestra clase principal y agregar dentro del mtodo main una nueva instancia de la clase Ventana...