Andrea "Kiraya"Magini

IT Professional Master

Single post

JSF2 SelectOneRadio e DataTable

Spesso capita di dover utilizzare ,lavorando con le JSF, in una colonna di una DataTable i radiobutton. Ovviamente non appartenendo allo stesso container (essendo contenuti uno in ogni cella diversa), non sono raggruppabili, e, in html, agiscono come entità separate e svincolate.

Utilizzando le Java Server Faces, ci vengono in aiuto i valueChangeListeners.
Innanzitutto, mettiamo il selectoneradio nella datatable, impostando come listener un metodo sul nostro backingBean.

<h:dataTable value="#{bean.elementi}" var="elemento">
<h:column>
<f:facet name="header">Seleziona:</f:facet>
<h:selectOneRadio id="radioSeleziona" value="#{bean.selezione}" valueChangeListener="#{bean.doSeleziona}" onclick="dataTableSelectRadio(this);">
<f:selectItem itemValue="#{elemento.id}"></f:selectItem>
</h:selectOneRadio>
</h:column>
</h:dataTable>

 

Non essendo un radioButton multiplo (non è un insieme), per deselezionare gli altri radioButton quando si clicca su quello scelto,utilizziamo una funzione javascript agganciata nell’evento onclick.

function dataTableSelectRadio(radio) {
var id = radio.name.substring(radio.name.lastIndexOf(':'));
var element = radio.form.elements;
for (var i = 0; i < element.length; i++) {
if (element[i].name.substring(element[i].name.lastIndexOf(':')) == id) {
element[i].checked = false;
}
}
radio.checked = true;
}

Sul nostro backingBean poi , andiamo ad implementare il ValueChangeListener:

public void doSeleziona(ValueChangeEvent event){
elementoSelezionato= (String)event.getNewValue();
internalDoQualcosa();
}

Ovviamente potete sostituire lo script javascript con qualcosa di più semplice utilizzando JQuery, ma la sostanza rimane questa.