j formatted text field

Download j Formatted Text Field

Post on 12-Aug-2015

52 views

Category:

Documents

4 download

Embed Size (px)

TRANSCRIPT

USOS INTERESANTES DE JFormattedTextFieldv. 1.1 Francesc Ross i Albiol (03/2005)Todos los que en alguna ocasin nos hemos tenido que enfrentar al desarrollo de interficies de usuario en Swing nos hemos encontrado con algunas deficiencias en cuanto a los componentes disponibles. Una de ellas, y creo que importante por su uso masivo en aplicaciones de este tipo, ha sido la de los campos de entrada. Hasta la aparicin de la versin 1.4 del JDK, slo disponamos de JTextField. Un componente bastante limitado que pona de manifiesto las deficiencias de Swing respecto a otras aproximaciones como, por ejemplo, Delphi. Siempre he defendido a Swing respecto a las tpicas aproximaciones de Windows haciendo hincapi en la bondad de su arquitectura y las posibilidades que sta ofrece al desarrollador para extender de manera relativamente fcil (o, al menos, ortogonal) los componentes que nos ofrece. Fruto de ello fue la pequea coleccin de widgets que desarroll para JDK 1.2 que inclua, entre otros, un campo con mscara o campos especializados para nmeros.1 Pero la verdad es que, a pesar de dichas posibilidades de expansin, si queras algo tan simple como un spinner, te lo tenas que fabricar y eso siempre da pereza y est sujeto a errores difciles de controlar. Cuando apareci la versin 1.4 del JDK, tuve la impresin de que Sun haba, de alguna manera, recogido las quejas de los usuarios y se haba decidido a cubrir algunas de las necesidades bsicas del desarrollador de interficies de usuario proporcionando, por primera vez en bastante tiempo, dos componentes bsicos: JSpinner y JFormattedTextField. Este artculo, como su ttulo indica, pretende profundizar en las posibilidades que nos ofrece JFormattedTextField. JFormattedTextField no es ms que una extensin de JTextField que viene a cubrir algunas de las deficiencias que todos encontrbamos en l. Un campo de entrada es un componente que cumple una doble funcin. Por una parte, permite que el usuario entre el texto que se corresponde con un dato solicitado por la aplicacin; y por otra, permite a la aplicacin mostrar datos al usuario. La principal limitacin que le encuentro a JTextField es que permite entrar cualquier texto y que no hay manera fcil de mostrar un texto con un formato concreto. No hay posibilidad de establecer un control sobre lo que el usuario entra ni manera sencilla de mostrar convenientemente datos de tipos tan habituales como fechas o nmeros. Lo primero que uno piensa cuando se acerca por primera vez a JFormattedTextField es finalmente tenemos un campo que soporta mscaras. Todos esperbamos este componente. Sin embargo, su nombre no es algo as como JMaskedTextField. Su nombre nos insina que va ms all de un campo con mscaras. Se trata de un campo de entrada de texto que nos permite especificar formatos. Ciertamente, una manera de especificar un formato de entrada es mediante una mscara, pero no es el nico. Adems, como acabo de comentar, un campo de entrada no slo sirve para1 Algunos de estos widgets se pueden encontrar en mi Web personal (http://www.froses.com/ES/Descarregues/Widgets.htm).

1 de 24

entrar texto. Tambin muestra lo que hemos entrado. Volveremos ms tarde sobre este punto. Resumiendo un poco las caractersticas de este componente podemos decir que: Distingue entre el valor del campo y el texto que lo representa Permite especificar formatos fijos de entrada de datos, por ejemplo, mediante mscaras Sabe aprovechar el resto de especificaciones de formato disponibles en Java para nmeros, fechas, horas, etc. Permite decidir si se admiten caracteres incorrectos en la entrada o no. Permite distinguir entre modalidad de edicin y modalidad de visualizacin. Permite establecer dos modalidades de escritura: insercin y sobrescritura. Permite que decidamos qu hacer con el foco si lo que el usuario ha entrado no es correcto, al beneficiarse de las nuevas capacidades del JDK 1.4 para la comprobacin de valores en Swing. Bueno, creo que las posibilidades que nos ofrece JFormattedTextField son esperanzadoras e intentar mostrar hasta qu punto. Para ello, he pensado dividir el artculo en tres partes diferenciadas con objetivos distintos. La primera, muestra los usos ms habituales de JFormattedTextField y comenta cmo usar la clase javax.swing.InputVerifier para controlar el foco en base al valor entrado en el campo. El objetivo, en esta primera parte, es conseguir que el lector pueda utilizar fcilmente JFormattedTextField en sus aplicaciones. La segunda discute ms a fondo la arquitectura y el funcionamiento de JFormattedTextField, y tiene como objetivo preparar al lector para poder extender las posibilidades de JFormattedTextField, extendindolo y creando nuevos componentes especializados. En la tercera, presento algunos widgets derivados de JFormattedTextField, y desarrollados especficamente para este artculo, que tienen un doble objetivo: mostrar al lector una posible va de expansin del componente que nos ocupa y proporcionarle unos componentes listos para ser usados en sus aplicaciones. Tambin proporciono algunas aplicaciones que ejemplifican tanto el uso de estos widgets como de algunos aspectos de JFormattedTexField y de las clases derivadas de JFormattedTextField.AbstractFormatter.

USOS GENERALES DE JFormattedTextFieldComo he comentado ms arriba, el objetivo de este captulo es proporcionar la informacin suficiente al lector para que pueda hacer uso de las principales funcionalidades de JFormattedTextField.

Qu es JFormattedTextField?JFormattedTextField es un componente derivado de JTextField que, como ste, sirve para entrar y mostrar datos. Una de las caractersticas principales de JFormattedTextField es la de permitir dar formato a los datos, tanto en el momento de entrarlos como en el de visualizarlos. Para ello, y a diferencia de JTextField, JFormattedTextField distingue entre el valor almacenado (una subclase de Object accesible mediante el mtodo getValue()) y el texto que muestra (una java.lang.String accesible mediante getText()). En el siguiente apartado, veremos cmo podemos especificar los distintos formatos.

2 de 24

Especificacin de formatoEl componente JFormattedTextField nos permite especificar el formato de diversas maneras:

De manera automtica: Asignando un valor al campoSimplemente asignando un valor al campo, ste nos asigna un formato. As, por ejemplo, si le asignamos una fecha, l nos la permitir editar. El siguiente cdigo crea un campo de entrada para fechas con el formato por defecto:JFormattedTextField efFecha = new JFormattedTextField(new Date());

El campo mostrar la fecha actual con el siguiente formato:19-ago-2002

Pero no slo nos presenta la fecha. Nos permite editarla de una manera sencilla y sin error posible. Si colocamos, por ejemplo, el cursor sobre el mes y pulsamos la flecha hacia arriba, el mes cambia y pasa a ser sept. Si pulsamos la flecha hacia abajo, el mes ser jul. El mismo comportamiento se da para el da y el ao. Adems, el comportamiento es inteligente. Supongamos que la fecha sea 28 de febrero de 2002 y que aumentemos el da. La nueva fecha sera 1 de marzo de 2002. Lgicamente, si el ao fuera el 2000 (bisiesto) la fecha propuesta sera el 29 de febrero de 2000.

Mediante una mscaraPodemos utilizar una mscara para determinar el formato. Por ejemplo, si quisiramos crear un campo para entrar cdigos de cuenta corriente, podramos hacerlo as de fcil:MaskFormatter mfCC = new MaskFormatter(####-####-##-##########); mfCC.setPlaceholderCharacter('_'); JFormattedTextField efCC = new JformattedTextField(mfCC);

El campo tendra el siguiente aspecto:____-____-__-__________

Fijmonos que las partes escribibles se representan con el carcter de subrayado que hemos especificado con setPlaceholderCharacter(). La siguiente tabla resume los caracteres utilizables en una mscara:

Carcter# ? A * U L H ' Un nmero Una letra

Descripcin

Una letra o un nmero Cualquier cosa Una letra que ser pasada a mayscula Una letra que ser pasada a minscula Un dgito hexadecimal (A-F, a-f, 0-9) Carcter de escape para otro carcter de mscara

Mediante descriptores de formato ya existentesJava nos ofrece una amplia gama de especificaciones de formato para fechas, horas, nmeros y monedas. Todos ellos pueden ser utilizados, directa o indirectamente, para especificar el formato 3 de 24

usado por el campo. Ejemplificaremos algunos de ellos. Ms arriba, hemos mostrado cmo especificar un formato de fecha simplemente pasando una al constructor del campo. El resultado es vistoso, pero cualquier persona que entre datos nos dir que es poco prctico. Sera ms interesante algo del estilo de dd/mm/aa. El siguiente cdigo nos muestra cmo hacerlo:2JFormattedTextField efFecha = new JFormattedTextField(new SimpleDateFormat(dd/MM/yy));

El resultado obtenido sera: 19/08/02. El comportamiento de las flechas sera el ya descrito. Si lo que pretendemos es entrar un nmero con un mximo de dos decimales:JFormattedTextField efNum = new JformattedTextField(new DecimalFormat(#,###.00));

Si nos interesa que el usuario entre importes en euros en nuestro campo:JFormattedTextField efMon = new JformattedTextField(NumberFormat.getCurrencyInstance()); efMon.setValue(new Integer(1000));

Lo que veramos sera:1.000,00

Admitir o no caracteres incorrectosA veces, nos puede interesar permitir que el usuario pueda entrar caracteres incorrectos. Para hacerlo, usaremos formateadores propios de JFormattedTextField. Veamos el siguiente ejemplo:3JFormattedTextField efNum = new JformattedTextField(new DecimalFormat(#,###.00)); NumberFormatter nf = (NumberFormatter)efNum.getFormatter(); nf.setAllowsInvalid(true);

Disponemos de tres formateadores especiales derivados todos ellos de la clase javax.swing.JFormattedTextField.AbstractFormatter: MaskFormatter Utilizado para mscaras y derivado directamente de AbstractFormatter. NumberFormatter Utilizado para nmeros y derivado de

Recommended

View more >