JSF - Selecionar linhas do DataTable com radio buttons e checkBoxes

2 respostas
D

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.

2 Respostas

S

Resolvi a questão dos radio com esse post meu, mas ainda tenho um problema ; selecionar apenas um
[url]http://www.guj.com.br/java/290173-problema-com-selectoneradio-em-datatable#1535364[/url]
, 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()) {
é iterada
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);
detalhe: para "setar" como true o isSelecionado: Isso no lugar da h:dataTable:
&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[url]: http://balusc.blogspot.com.br/2006/06/using-datatables.html[/url] e [url]http://balusc.blogspot.com.br/2006/06/using-datatables.html[/url], mas não consegui implementar, por isso, se conseguir, quero muito a sua ajuda.

Qualquer dúvida este é meu e-mail: [email removido]

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

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

S

Foi útil? Conseguiu?

Criado 16 de novembro de 2010
Ultima resposta 22 de dez. de 2012
Respostas 2
Participantes 2