Jan 29

Jugando con Apache Pivot

 

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.

Entradas relacionadas:

10 Responses to “Jugando con Apache Pivot”

  1. shr Says:

    [..]Bueno, ahora sólo me queda[...]

    Hacer un tutorial :)

  2. Chuidiang Says:

    Uy, el tutorial básico “hola mundo” seguro que acaba cayendo en la chuwiki ;-)

  3. shr Says:

    Maravilloso el feed de la chuwiki, muchas gracias Chuidiang :D

  4. yaiza Says:

    Hola! Buen artículo, ya nos contarás qué tal :)
    Sólo añadir que ese tipo de validaciones (y bastante más potentes) además de muchas otras cosas interesantes, las tienes con JavaServer Faces. 100% recomendable :)

  5. Pablo Says:

    “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.”

    Hace poco en el trabajo hemos tenido la idea de aplicar MVC a Swing, ya que no hemos encontrado un framework que nos satisfaga.

    Y la idea que surgio para crear vistas es muy similar a la que veo aqui :P . Hay muchisimas diferencias… ademas que al ser principiantes nunca hemos hecho un bean (Actualmente pedimos al programador de la vista que asocie la Clave a uno [o varios] JComponents), y para el uso basico que le estamos dando, esta quedando bien :P .

    La idea es tener algo minimamente estable que funcione con varios componentes (hasta ahora solo admite checkboxes, comboboxes, paneles, textfields,jtables, botones y labels), documentarlo bien, para luego poder liberarlo bajo GPL.

    Si te llegase a interesar… apenas lo libere te aviso, asi lo criticas libremente :P

  6. Chuidiang Says:

    Pues sí me interesa, avísame si me haces el favor.

    En su día hice algo parecido http://proyectos.chuidiang.com/editores/index.html pero lo hice con Hashtables en vez de beans. En algún momento intenté ampliar esa librería con beans, pero lo dejé a medias.

  7. Pablo Says:

    Bueno, hasta que encontre en que blog habia posteado esto! :P

    Basicamente, lo que hemos hecho es, al ser MVC, “automatizar” el rellenado de objetos Swing.

    Un ejemplo pavo:

    Del lado de la vista, hay que “bindear” una clave con uno (o varios) componentes Swing, por ejemplo:
    addComponente(jComboBox1, “Equipos”);

    Esto bindeara el string “Equipos” con el jComboBox1.

    Del lado del controlador, cuando quieras modificar el combobox:

    setConfiguracion(“Equipos”,miArrayDeEquipos); //Del lado del control

    Y listo. Si quieres seleccionar uno de los elementos de la combo, haces:

    setConfiguracion(“Equipos”,miArrayDeEquipos.get(1)); //Del lado del control

    Y el framework seleccionara en la vista ese elemento.

    El “Equipos” en realidad puede ser cualquier objeto. Actualmente usamos un Enum en el que cada elemento es un “grupo de componentes”. El enum nos permite evitar typos (que en nosotros, ha sido bastante comun al escribir algun XML), y talvez documentar mejor… aunque es una funcionalidad relativamente nueva (una semana) y no la hemos podido testear a fondo (desgraciadamente no usamos TDD en base a ignorancia propia).

    Cuando hablo de “Grupo de componentes”, es principalmente porque uno puede hacer en la vista:

    addComponente(jComboBox1, “Equipos”,jLabel1,jButton1);

    Y de esta forma, estableces que jComboBox1 contendra “informacion”, mientras que jLabel1 y jButton1 seran componentes “secundarios”, que estan asociados al primero. Esto sirve para cuando uno desea hacer un campo como visible o editable… Desde el control, podrias hacer:

    setConfiguracion(“Equipos”,miArrayDeEquipos,true,false); //Del lado del control

    y setea todo el “Grupo de componentes” en visible = true, y enabled = false.

    Tiene un monton de cosas mas, pero definitivamente hemos fallado en documentar el sistema con tutoriales y cosas por el estilo… (el trabajo nos mantiene ocupados como para “fomentar” el framework mas alla de la empresa).

    Nos faltarian un par de componentes swing importantes (como los jTree), pero actualmente es funcional. El tema de la validacion tambien está pendiente, ya que estamos en la discusion filosofica de si eso le corresponde al Control o a la Vista…

    Si te gusta leer codigo feo, y encima mal documentado, aqui paso el link con el framework y un “ejemplo” pavo de como anidar “controles”, y otro sobre como recojer eventos…

    http://rapidshare.com/files/404853084/src.zip

    Saludos, y espero que al menos la idea guste :P (Ya que la implementación no es de las mejores)

  8. Chuidiang Says:

    Hola:
    Muchas gracias, me lo acabo de bajar y voy a echarle un ojo.
    Gracias de nuevo y se bueno.

  9. Pablo Says:

    Y, pudiste?

    Criticas del estilo “esto ya existe”/”no me salio nada”/”es complicado”/ “está todo mal”? :P

    (no me molesta que seas duro, es parte de saber en que mejorar)

  10. Chuidiang Says:

    Pues fíjate que estupidez, pero todavía no lo he mirado. Resulta que los niños ya no tienen “cole” ni que madrugar al día siguiente, así que según llego del “curro”, me toca parque hasta horas intempestivas de la noche …..

    A ver la semana que viene que me quedo de Rodriguez…

    Se bueno.

Leave a Reply