martes, 16 de agosto de 2016

Datatable Single Selection con RadioButton en JSF- icefaces



Aunque algunos frameworks JSF ya incluyen una funcionalidad se selecciona simple en su componente Datatable tal es el caso de Primefaces, esta pequeña entrada se hace un ejercicio con JSF y Icefaces framework que no trae la funcionalidad en la version 3.2.

El requerimiento es realizar una selección simple en un componente Datatable mediante un RadioButton y cargar el objeto Dto seleccionado en el BackingBean.

Al termino del ejercicio se muestra un componente como el siguiente:




Tecnologias usadas en el ejemplo:
Servidor : Glassfish 4
Icefaces 3.3.0
JSF 2.2
JavaEE 7 
Maven


El truco esta en fusionar 2 componentes con una sola lista de origen, un SelectOneMenu y un Datatable, el ejemplo lo ilustro como imagen para que se entienda mejor, al final de la explicación pondré el link del proyecto.

Tenemos un Dto:

public class PersonaDto {    
    private int id;
    private String nombre;
    private int edad;

    public PersonaDto(int id, String nombre, int edad) {
        this.id = id;
        this.nombre = nombre;
        this.edad = edad;
    }
   //...Getters and Setters          
}

Nuestro JSF ManagedBean :
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ValueChangeEvent;

 private List<PersonaDto> listaPersona;
    private PersonaDto personaSeleccionada;
    private int indexSelected;
     
    public DatatableSelect() {
    }
    
    //cargar valores    
    @PostConstruct
    public void postInit(){
        System.out.println("Cargando valores para mostrar en la grilla..");
        
        listaPersona = Arrays.asList(
                new PersonaDto(1, "Jose Alfredo Jimenez", 45),
                new PersonaDto(2, "Rodrigo X X", 50),
                new PersonaDto(3, "Miguel Y Y", 45)
        );
    }

    public void valueChangeRadioSelected(ValueChangeEvent change) {
        System.out.println("valueChangeRadioSelected");        
        
        final Object indexObject = change.getNewValue();
               
        setIndexSelected(indexObject != null ? (Integer) indexObject : -1);
        
        System.out.println("index"+indexObject);
        
        System.out.println("index se"+indexSelected);
        
        if (indexSelected != -1) {
            
            this.personaSeleccionada = listaPersona.get(indexSelected);            
            
            System.out.println("Persona seleccionada ");
            System.out.println("Id : "+this.personaSeleccionada.getId());
            System.out.println("Nombre : "+this.personaSeleccionada.getNombre());
            System.out.println("Edad : "+this.personaSeleccionada.getEdad());
        }
    }
    
    
    public List<PersonaDto> getListaPersona() {
        return listaPersona;
    }   

    public int getIndexSelected() {
        return indexSelected;
    }

    public void setIndexSelected(int indexSelected) {
        this.indexSelected = indexSelected;
    }

    public PersonaDto getPersonaSeleccionada() {
        return personaSeleccionada;
    }


Tenemos nuestro código en JSF-ICefaces:



Espero haberme explicado :)... dejo el código por aquí en Github.


Posteriormente actualizaré con la selección múltiple con Checkbox (en cuanto haya tiempo).