Esta mañana he estado jugando un poco con Apache Pivot. Es una librería puramente java para hacer aplicaciones ricas de internet (RIA). Normalmente yo me dedico a aplicaciones de escritorio, no de internet, pero tenía curiosidad por ver cómo era y si se podría aprovechar en una aplicación de escritorio.
La librería contiene básicamente todos los componentes habituales para hacer ventanas, clases java estilo Button, TableView, TextInput, etc. Las ventanas pueden construirse o bien usando un fichero xml en el que se indica qué componentes llevan dichas ventanas, o bien directamente desde código java, con un main(). Estos componentes tienen su aspecto propio, que no es el de SWING ni el del sistema operativo en el que corramos la aplicación. Aunque no lo he probado, aparentemente facilita mucho cosas como drag&drop o los efectos de aparición y desaparición de ventanas suavemente, degradados, transparencias, etc.
Pero lo que más me ha llamado la atención es la forma de rellenar u obtener datos de un formulario. Es algo detrás de lo que ando mucho tiempo y no he llegado a conseguir. Lo llaman "data binding" y consiste en lo siguiente:
- Por un lado tienes tu formulario. A cada uno de los campos de dicho formulario lo identificas con una clave. Por ejemplo, si hacemos una ventana para pedir nombre y apellidos, podemos poner dos TextInput a los que identificaremos con las claves nombre y apellidos.
- Por otro lado, podemos tener un Java Bean normalito, con dos atributos privados que se llamen igual que las claves del formulario, es decir, un atributo nombre y otro apellidos. Por supuesto, los correspondientes métodos get() y set().
Pues bien, el formulario (clase Form de Apache Pivot) tiene métodos load() y store(), que directamente son capaces de extraer los atributos del Java Bean y meterlos en el formulario y al revés, haciendo coincidir clave con atributo. Permite además formularios anidados, que corresponden con Java Beans anidados.
En cuanto a las tablas (clase TableView), también es bastante sencilla. Al definir la tabla damos a cada columna un identificador, que luego correspoderá con el atributo del Java Bean. Así, siguiendo el ejemplo, nuestra tabla tendría dos columnas identificadas por nombre y apellidos. Nos basta ahora meter en el TableView usando el método setTableData() una List de nuestros Java Bean. La tabla se rellena solita.
Y más cosas interesantes. En las aplicaciones es importante validar los datos que se introducen. de forma que un TextInput, por ejemplo, sólo admita números entre 1 y 10,. Pues esto también está bien contemplado. Los TextInput tienen un setValidator() en el que podemos pasar una clase encargada de validar el dato según lo va escribiendo el usuario (el TextInput permanece rojo hasta que contiene un dato válido). La librería tiene ya hechos un montón de Validators habituales, como números en un rango determinado. También es interesante saber que si nuestro Java Bean tiene por ejemplo un atributo double (que no sea String), no tenemos que hacer nada especial, el formulario sabe convertirlo a texto para mostrarlo en el TextInput o reconstruirlo a partir del texto introducido por el usuario para devolver un double. Tanto los métodos load() y store() de la clase Form se "tragan" perfectamente atributos de varios tipos estándar de java, no sólo String.
Bueno, ahora sólo me queda buscar o hacer algo perecido a todo esto, pero con los componentes SWING normales de java, para poder empezar a usarlo sin tener que cambiar TODA la interface de un sólo golpe.