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).