Binding un ArrayList a un DropDownList en JSF

El día de ayer se me hizo la siguiente consulta ¿cómo puedo utilizar un ArrayList como fuente de datos para un DropDownList en JSF?

Al parecer la respuesta no debería ser tan complicada, especialmente si la mayoría de aplicaciones JSF lo he realizado con JDeveloper y ADF, pero el proyecto se está desarrollando en NetBeans, es decir JSF puro.

Les explico un poco la estructura del programa. Tengo un POJO llamado Ubicación (atributos: código, nombre, codigo de país, código postal). Muestro parte del código, hacen falta los métodos set y get para cada atributo.

public class Ubicacion{

private int codigo;
private String nombre;
private String codigoPais;
private String codigoPostal; public Ubicacion(int codigo, String nombre, String codigoPais, String codigoPostal) {

this.codigo = codigo;
this.nombre = nombre;
this.codigoPais = codigoPais;
this.codigoPostal = codigoPostal;

}

….

Dentro del bean de session que crea NetBeans, he creado una propiedad – un ArrayList que contiene elementos de tipo Ubicación y que se denomina ubicaciones, cree los métodos get y set para dicha propiedad e inicialicé con algunos valores el ArrayList.

public class SessionBean1 extends AbstractSessionBean {

private ArrayList<Ubicacion> ubicaciones = new ArrayList<Ubicacion>();

Finalmente la parte visual en donde ubico un dropdownlist o combo, hago el binding especificando el atributo ubicaciones que se encuentra dentro del bean de sesión.

<webuijsf:form binding=”#{Page1.form1}” id=”form1″>

<webuijsf:dropDown binding=”#{Page1.dropDown1}” id=”dropDown1″ items=”#{SessionBean1.ubicaciones}” />

</webuijsf:form>

Hasta ahí, ejecuté la aplicación y lo que obtuve fue una página en blanco ¿que pasó?En ningún momento especifiqué que atributo debería ser el valor del dropdown ni tampoco lo que muestra al usuario.

Investigando llegué a ver que existe una clase Option (com.sun.webui.jsf.model.Option) de la cual deben heredar todas las clases que serán mostradas como elementos dentro de un dropdownlist. Es necesario configurar 2 atributos, value y label. Value indica el valor interno y label es lo que el usuario verá. El código de la clase Ubicación se vería así:

public class Ubicacion extends Option{

private int codigo;
private String nombre;
private String codigoPais;
private String codigoPostal;

public Ubicacion(int codigo, String nombre, String codigoPais, String codigoPostal) {

this.codigo = codigo;
super.setValue(codigo);
this.nombre = nombre;
super.setLabel(nombre);
this.codigoPais = codigoPais;
this.codigoPostal = codigoPostal;

}

Los métodos setValue y setLabel son heredados.

Bueno esto es nuevo para mi y espero que les sirva.

Powered by ScribeFire.

JComboBox y Beans Binding

ACTUALIZACIÓN:

Al momento de escribir éste post, la versión disponible de beans binding era la 0.5, por su número de versión podemos decir que dicho API se encontraba en desarrollo, por tal razón y con la salida de la versión oficial (versión a partir del 1) se han tenido varios cambios que hacen imposible que éste ejemplo trabaje según lo inidicado. Les recomiendo que trabajen con la última versión de beans binding. Pero no todo está perdido revisando en la Web y en blog de Patrick Keegan existe un ejemplo que no enseña cómo debemos hacerlo ahora; les comparto el link

En éste post he construido una aplicación que carga y muestra datos en un JComboBox, pero utilizando una solución diferente a la que planteé en un post anterior, pero la misma finalidad, una vez que se selecciona un valor en el combo necesito conocer el id (no el índice) del valor seleccionado, así como los combos de visual fox.

Demo

Para ésta nueva aplicación utilicé los Beans Binding, una nueva especificación de Java que permite tener sincronizados 2 Beans. Parte del código de la misma explicaré en las siguientes líneas.

En primer lugar tengo una clase (Primer Bean) que se llama Periodo que tiene 2 atributos tipo String id y nombre, y los métodos set y get para cada uno de ellos, además un constructor que permite crear objetos de la clase Periodo inicializando ambos parámetros.

Clase Periodo

La clase periodo será la que alimente de valores para el combo.

Tengo un formulario en donde se dibujan 2 etiquetas y 1 combo. Una de las étiquetas presenta el id del valor seleccionado en el combo.

Para utilizar los Beans Binding es necesario descargar el archivo beansbinding-0.5.jar e incluirlo dentro del proyecto de NetBeans. El código que permite crear objetos de la clase Periodo se encuentra en el método crearPeriodos() definido dentro del JFrame, los periodos creados son asignados a la propiedad periodos que es un objeto de la clase List.

Método que crear los objetos Periodo

Para asociar los valores de la lista de periodos al combo(2do Bean) es necesario utilizar Beans Binding en donde se puede ver que se hace uso de la EL (Expression Lenguage) para hacer referencia a los atributos de la clase Periodo, aquí el código:

Método que carga los datos al combo

Los parámetros de la línea 94 señalan que cuando se seleccione un valor del combo se debe seleccionar el atributo id de la clase Periodo. Existe otra manera (código comentado)de configuración en donde se señala que el objeto seleccionado no será un atributo sino todo el objeto.

El trabajo con los Beans Binding es de la manera fuente destino y podemos ver en la línea 93 como el origen de los datos es el ArrayList periodos y el destino es el combo (cbxPeriodos) y se señala que cada objeto que se encuentra en el ArrayList será un elemento (elements) del combo. Se llama al método bind para que tenga efecto las configuraciones anteriormente hechas.

La línea 95 dice que el atributo que debe presentar el combo es el atributo nombre que se encuentra en la clase Periodo.

Luego se crea un segundo bind en donde el origen es el combo, el valor seleccionado (en éste caso el id del periodo seleccionado) y el origen es una etiqueta (lblIdPeriodo 3er Bean) en su propiedad text.

Con ésto se logra el mismo efecto que en el post anterior, pero simplificado, debido a que no se debe programa el evento actionPerformed y son los Beans Binding se encargan de hacer la sincronización.

Dentro del método cargarPeriodos existen algunas líneas comentadas que muestran la segunda manera de configurar los elementos del combo y sincronizarla en éste caso con una propiedad de la clase actual (JFrame) que se llama periodoSeleccionado.
Como nos podemos dar cuenta en la especificación del Bean Binding, éste aún se encuentra en desarrollo y me imagino que la primera versión verá la luz con el lanzamiento de NetBeans 6.0, esto lo digo ya que NetBeans.