Beruflich Dokumente
Kultur Dokumente
Objeto JDialog En una aplicacin java con ventanas debera haber un nico JFrame, correspondiente a la ventana principal de la aplicacin. El resto de ventanas secundarias deberan ser JDialog. Por supuesto, podemos usar JInternalFrame, si lo deseamos sin ningn problema, pero en sta sesin nos referimos slo a ventanas "reales", a las que el sistema operativo trata como tales.
Ing. Martn Salcedo Quiones Pgina 1
});
Objeto JTree El JTree es el componente java visual (como los botoncitos, listas, mens, etc) que nos permite visualizar un rbol. En l podemos ver el tpico rbol de datos en el que podemos abrir cada uno de los nodos para ver qu tiene dentro, cerrarlos, etc. Similar al rbol de directorios que nos muestran algunas aplicaciones para elegir un fichero. Como en casi todos los componentes visuales de java, hay dos clases importantes implicadas. Por un lado tenemos "la vista", que es la clase java que se ve. Esta clase es el JTree y es lo que se ve en la pantalla, en nuestra ventana. Por otro lado tenemos el "modelo de datos". Esta clase de java puede ser cualquier clase que implemente la interface TreeModel, pero java nos ofrece ya implementada la clase DefaultTreeModel. Esta clase es la que contiene los datos que queremos visualizar en "la vista". Contiene los datos que visualizaremos en el JTree. Puesto que vamos a hacer un rbol, admite datos que se puedan asociar entre s como padres e hijos. No valen datos cualesquiera. Esos datos deben implementar la interface TreeNode. Cualquier clase que implemente esta interface, tendr mtodos para interrogarle sobre quin es su padre, si tiene hijos, etc. Estos mtodos ser los que acabe usando JTree para saber qu debe pintar, quin es hijo de quin y quin es padre de quin. Existe otro tipo de dato tambin importante, el MutableTreeNode. Este es igual que el anterior, pero adems tiene mtodos para modificar las asociaciones entre padres e hijos. Permite aadir nuevos hiijos a los padres, cambiar el padre de los hijos y cualquier otro tipo de indecencia que se nos ocurra. Si nuestro rbol va a cambiar sobre la marcha, nos interesa usar datos (nodos) que implementen esta interface. Java nuevamente nos ofrece una clase que ya implementa MutableTreeNode y por tanto tiene todos los
Ing. Martn Salcedo Quiones Pgina 5
Primero instanciamos nuestro modelo de datos, el DefaultTreeModel y la parte visual, el JTree. Metemos el primero dentro del segundo. La clase DefaultTreeModel necesita en su constructor el nodo raz del rbol, es decir, el dato que hace de padre de todos los dems, el de ms alto nivel. Por ello, debemos instanciar este primer dato para poder construir el DefaultTreeModel. Ese primer dato ser un DefaultMutableTreeNode. A este DefaultMutableTreeNode podemos pasarle el dato que queramos bien a travs del mtodo que comentamos setUserObject(), bien a travs del constructor. Nuestro dato ser un simple String que diga "abuelo" y lo meteremos en el constructor. El cdigo quedara as
DefaultMutableTreeNode abuelo = new DefaultMutableTreeNode("abuelo"); modelo = new DefaultTreeModel(abuelo); JTree tree = new JTree(modelo);
Ahora slo nos queda ir aadiendo el resto de los datos del rbol. Lo nico que tenemos que hacer es ir creando los nodos, como DefaultMutableTreeNode. A
Ing. Martn Salcedo Quiones Pgina 6
pasamos nodo padre e hijo que queremos asociar y el se encarga de hacer la asociacin. La diferencia de hacerlo de una manera u otra es que JTree se entera automticamente de cambios de DefaultTreeModel y los refleja automticamente en pantalla, pero no se entera de los cambios en los DefaultMutableTreeNode y por tanto no los refresca en pantalla. Puesto que estamos haciendo un ejemplo simple y es ms simple, usaremos el mtodo insertNodeInto() para hacer la asociacin. Este mtodo lleva tres parmetros: Nodo que queremos que sea hijo Nodo que queremos que sea padre
En qu posicin queremos que est el hijo respecto a otros hijos. Dicho de otra forma, cuando despleguemos un padre que tiene por ejemplo cuatro hijos, en qu posicin queremos que est este nuevo hijo: el primero, en medio, el ltimo.
Objeto JFormattedTextField El JFormattedTextField es un componente java un paso ms evolucionado que un JTextField normal. El JTextField permite al usuario ingresar texto. Cuando desde nuestro cdigo le pedimos el contenido, nos devuelve el texto introducido por el usuario como String. Cuando desde cdigo le decimos lo que queremos que muestre, debemos pasarle un String. El JTextField, adems, no hace ningn tipo de comprobacin sobre el texto. El JFormattedTextField da un paso ms all. Aunque el usuario mete un texto, el JFormattedTextField lo convierte a la clase que nosotros queramos (un Integer, Float, Date o incluso una clase nuestra propia). Cuando queramos pasarle algo, le podemos pasar directamente cualquiera de estas clases y l se encarga de la conversin a texto para mostrar. Para editar cualquier tipo bsico de java, estilo Integer, Float, Double, Date, etc, basta con llamar al mtodo setValue() del JFormattedTextField pasndole uno
Pgina 9
Con esto ya tenemos un editor que nos permite recoger Integer directamente cuando el usuario lo edite:
Integer valor = textField1.getValue();
Supongamos que el usuario escribe algo en el JFormattedTextField y luego pincha con el ratn en otros sitio (se dice que el JFormattedTextField pierde el foco), por ejemplo, en un botn de "Aceptar" los cambios introducidos. En el momento que el JFormattedTextField pierde el foco, comprueba el texto escrito por el usuario. Si es correcto, lo guarda de forma que el mtodo getValue() nos devolver el nuevo valor. Si es incorrecto, pondr automticamente el ltimo valor bueno, deshaciendo el cambio hecho por el usuario. Este comportamiento puede cambiarse con el mtodo setFocusLostBehavior(), al que podemos pasar varios valores:
JFormattedTextField.COMMIT. Si el texto introducido es correcto, se guarda para devolverlo cuando se haga getValue(). Si es incorrecto, no se hace nada, el texto en pantalla queda como esta, o sea, mal. getValue() nos devolver el ltimo valor correcto, independientemente de lo que se muestre en pantalla.
JFormattedTextField.REVERT. Cuando hacemos click en otro sitio, el editor vuelve automticamete a su ltimo valor bueno, descartando todas nuestras ediciones, sean correctas o no. Para que esta opcin tenga sentido, debemos llamar desde cdigo al mtodo commitEdit() sin que el
Pgina 10
JFormattedTextField.COMMIT_OR_REVERT. Esta es la opcin por defecto y la ms til. Si el texto introducido es incorrecto, se vuelve automticamente al ltimo valor bueno conocido. Si el texto no es vlido, se muestra el ltimo valor bueno conocido.<>
JFormattedTextField.PERSIST. Esta opcin no hace nada con el texto introducido, independientemente de que est bien o mal. getValue() siempre devolver el ltimo valor bueno conocido. Para que el editor recoga el nuevo valor, debemos llamar a commitEdit() previamente.
Existen varios JFormattedTextField.AbstractFormatter adems de los que podamos hacernos nosotros. Uno de los ms conocidos es el MaskFormatter. Este formateador restringe el texto vlido incluso mientras lo estamos tecleando. Al instanciar el MaskFormatter le damos un "patrn" sobre cmo queremos que sea el texto. Una vez configurado todo, el usuario no podr escribir en el FormattedTextField nada que se salga de ese "patrn". Veamos con un ejemplo qu quiero decir.
Supongamos que quiero un editor que me permita escribir un nmero con dos cifras enteras y dos decimales. No queremos que el usuario escriba algo que no sea un nmero y no queremos que escriba ni ms ni menos de las cifras de las indicadas. El editor debe admitir y devolvernos con setValue() y getValue() un Float. Para conseguir esto, basta instanciar un MaskFormatter y pasrselo al JFormattedTextField en el constructor. Para evitar problemas, le damos un valor vlido inicial vlido al editor. El new MaskFormatter lanza una excepcin, as que debemos capturarla.
try { /* El "patrn" para el editor. Las # representan cifras. En la API puedes ver ms. Ojo con el punto decimal, segn el idioma puede ser una coma.*/ MaskFormatter mascara = new MaskFormatter("##.##"); Ing. Martn Salcedo Quiones Pgina 11
Ya est listo. Nuestro editor slo admite nmeros de dos cifras enteras y dos decimales y no nos deja escribir otra cosa. Los mtodos getValue() y setValue() devuelven y admiten Floats.
Pgina 12