JSF - Selecionar linhas do DataTable com radio buttons e checkBoxes

Ola alguem sabe fazer ou tem algum exemplo de como realizar estas seleções com JSF sem usar o TomaHank ou outra implementação

Obrigado.

Resolvi a questão dos radio com esse post meu, mas ainda tenho um problema ; selecionar apenas um
http://www.guj.com.br/java/290173-problema-com-selectoneradio-em-datatable#1535364
, com a diferença que ao invés de usar UIdatatable será apenas HTMLDataTable para usar em JSF Puro.

agora, a questão de checkbox, a sugestão é usar um DTO, que ao carregar tuas listas, ele irá recebê-las, de modo que ele terá um objeto pelo qual a lista recebe, exemplo:
Este é o DTO que uso para criar os ceckboxes:
Não esqueça dos GETS/SETS,

public class DoadoresWrapper { private Doador doador; private boolean selecionado; }

A dataTable fica assim:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich">
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"></meta>
</h:head>

<h:body>
	<f:view>
		<rich:popupPanel id="modalPanelDoador" modal="false" width="600"
			moveable="false">
			<f:facet name="header">
				<h:outputText value="Defina os doadores"></h:outputText>
			</f:facet>

			<f:facet name="controls">
				<h:outputLink value="#" style="text-decoration:none;"
					onclick="#{rich:component('modalPanelDoador')}.hide(); return false;">X</h:outputLink>
			</f:facet>

			<rich:dataTable value="#{atendimentoBean.listaDoadores}"
				var="_doador" style="width: 100%;"
				noDataLabel="Não existem receptores cadastrados.">

				<rich:column width="40%">
					<f:facet name="header">
						<h:outputText value="Selecione" />
					</f:facet>
					<h:selectBooleanCheckbox value="#{_doador.selecionado}" />
				</rich:column>

				<rich:column width="40%">
					<f:facet name="header">
						<h:outputText value="Nome do Doador" />
					</f:facet>
					<h:outputText value="#{_doador.doador.nomeDoador}"></h:outputText>
				</rich:column>5

				<rich:column width="25%">
					<f:facet name="header">
						<h:outputText value="Tipo sanguíneo do doador" />
					</f:facet>
					<h:outputText value="#{_doador.doador.tipoSanguineo}"></h:outputText>
				</rich:column>

				<rich:column width="25%">
					<f:facet name="header">
						<h:outputText value="Tipo Hemoderivado do doador" />
					</f:facet>
					<h:outputText value="#{_doador.doador.tipoHemo}"></h:outputText>
				</rich:column>
			</rich:dataTable>
			<a4j:commandButton value="OK"
				onclick="#{rich:component('modalPanelDoador')}.hide(); return false;" />
		</rich:popupPanel>
		<br />
	&lt;/f:view&gt;
&lt;/h:body&gt;
&lt;/html&gt;

a minha lista é povoada assim:

tenho estes atributos no ManagedBean:

private List&lt;DoadoresWrapper&gt; listaDoadores; private List&lt;Doador&gt; doadoresSelecionados;

para povoar a DataTable uso isto, que basicamente percorre a lista de DoadoresWrappers (que é um DTO, contendo objetos do tipo DOADOR), onde se a lista for igual a null ou não ter registros, isEmtpy, a list<Doador> recebe a implementação no service de listagem de todos os registros

public List&lt;DoadoresWrapper&gt; getListaDoadores() { if (this.listaDoadores == null) { List&lt;Doador&gt; doadores = new DoadorService().listarTodos();
, e posteriormente será atribuída ao DTO


			this.listaDoadores = new ArrayList&lt;DoadoresWrapper&gt;();
			if (doadores != null && !doadores.isEmpty()) {[/code]

é iterada
[code]				for (Doador doador : doadores) {
					DoadoresWrapper doadorWrapper = new DoadoresWrapper();
					doadorWrapper.setDoador(doador);

adicionado o doador selecionado ao DTO:

					listaDoadores.add(doadorWrapper);
				}
			}
		}
		return this.listaDoadores;

	}

Ao salvar mais um truque:

Ao salvar, o método é chamado a partir de uma iteração no botão (commandButton), depois…

public void salvar(ActionEvent event) { FacesContext context = FacesContext.getCurrentInstance(); try {
… a lista de doadores(a tabela) é percorrida

			List&lt;Doador&gt; doadores = new ArrayList&lt;Doador&gt;();
			for (DoadoresWrapper doadoresWrapper : listaDoadores) {

Se for selecionada…

				if (doadoresWrapper.isSelecionado()) {

Será adicionada a lista de doadores…


					doadores.add(doadoresWrapper.getDoador());
				}

A partir daqui pode não ser importante para vocẽ

				List&lt;Receptor&gt; receptores = new ArrayList&lt;Receptor&gt;();
				for (Receptor receptorSelecionado : receptores) {
					receptores.add(receptorSelecionado);
				}

			}
			atendimentoEdicao.setReceptor(receptorSelecionado);


			atendimentoEdicao.setDoadores(doadores);

Aqui tudo é setado…

			new AtendimentoService().salvar(this.atendimentoEdicao);
			atendimentoEdicao.setDoadores(doadores);[/code]

detalhe: para "setar" como true o isSelecionado:
Isso no lugar da h:dataTable:
[code]&lt;rich:column width="40%"&gt;
					&lt;f:facet name="header"&gt;
						&lt;h:outputText value="Selecione" /&gt;
					&lt;/f:facet&gt;
					&lt;h:selectBooleanCheckbox value="#{_doador.selecionado}" /&gt;
				&lt;/rich:column&gt;

Respondendo tua dúvida sobre os radioButtons:

para obter qualquer atributo a partir de uma dataTable:
usará isso, caso use richfaces, para JSF Puro usará apenas HTMLDataTable.

private UIDataTable uiDataTable;

para obter um valor selecionado a partir de uma linha:

public void setReceptorSelecionado(ValueChangeEvent event) {
		receptorSelecionado = (Receptor) uiDataTable.getRowData();
		System.out.println(receptorSelecionado);
		listaReceptores = new ArrayList&lt;Receptor&gt;();
		listaReceptores.add(receptorSelecionado);
	}

No método de salvar, mais um truque:

public void salvar(ActionEvent event) { FacesContext context = FacesContext.getCurrentInstance(); try { List&lt;Doador&gt; doadores = new ArrayList&lt;Doador&gt;(); for (DoadoresWrapper doadoresWrapper : listaDoadores) { if (doadoresWrapper.isSelecionado()) { doadores.add(doadoresWrapper.getDoador()); }

Aqui, percorro a lista de receptores, setando o selecionado, à partir do que obtive no método setReceptorSelecionado:

List&lt;Receptor&gt; receptores = new ArrayList&lt;Receptor&gt;(); for (Receptor receptorSelecionado : receptores) { receptores.add(receptorSelecionado); }
após isso, basta salvar, mas ainda tem um problema: é possível selecionar mais de um ao mesmo tempo, podendo ser problemático, solução: http://balusc.blogspot.com.br/2006/06/using-datatables.html e http://balusc.blogspot.com.br/2006/06/using-datatables.html, mas não consegui implementar, por isso, se conseguir, quero muito a sua ajuda.

Qualquer dúvida este é meu e-mail: smnjr@Hotmail.com

Se for implementar minha dica, me ajuda também, por favor.

Detalhe, preciso de uma mão aqui…
http://www.guj.com.br/java/290173-problema-com-selectoneradio-em-datatable#1535364

Foi útil? Conseguiu?