PrimeFaces Check + datatable

Pessoal,

Seguinte, estou me quebrando a algum tempo com uma situação.
Tenho uma dataTable com 3 colunas, sendo uma delas um selectBooleanCheckbox. Este checkbox é para marcar se o registro em questão é o padrão. Sendo assim, apenas 1 deve estar selecionado. Quando marcar um, preciso desmarcar qualquer outro que possa estar selecionado.
Para poder fazer isto preciso saber qual foi o registro da dataTable que foi marcado/desmarcado o checkbox.

O problema é que quando eu marco o checkbox não sei como fazer para disparar o evento que marca qual o registro que está selecionado.
Se fosse um button por exemplo, utilizo desta forma <f:setPropertyActionListener value="#{item}" target="#{selection}" />
mas não da pra utilizar setPropertyActionListener dentro do selectBooleanCheckbox. Tentei utilizar com a tag <p:ajax, mas também não tive sucesso.

Alguém sabe como posso fazer para saber qual o registro que foi selecionado?

você poderia usar onchange.
acho que tem com checkbox.

daí usaria talvez uma requisição ajax, passando o id que você já deve trazer no objeto do datatable.

Como seria essa requisição ajax para passar o id?

Alguém mais tem alguma ideia?

Eu não sei como funciona o seu negócio, porém poderia
fazer algo assim:


<h:selectBooleanCheckbox value="$#{valor}>
    <f:ajax event="change" valueChangeListener="{metodoQueFazAlgo} render="datatable" execute="?"/>
</h:selectBooleanCheckbox>

Pensei em algo assim.

Consegui resolver este problema da seguinte forma:

[code]public String trocaProdutoPadrao() {
final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
.findComponent(":formForm:tabView:tabelaProdutoAdministradoraDataTable");

	ProdutoAdministradora linhaAtual = (ProdutoAdministradora)d.getRowData();
	
	for (ProdutoAdministradora prodAdmin : this.getProdutosAdministradora()) {
		
		if (!(prodAdmin == linhaAtual)) {
			prodAdmin.setProdutoPadrao(false);
		} else {
			prodAdmin.setProdutoPadrao(true);
		}
	}
	
	return null;
}[/code]

Só que isso me gerou um outro problema. Quando eu chamo esse método que faz a troca dos valores dos checkbox, só que para que tenha efeito visual, preciso dar um update da datatable. Quando faço isso, perco o valor de um campo texto, pois o valor do campo neste momento só está na camada de visualização, não foi ainda pro bean. Sabe como posso resolver isso?

Como assim só está na visualização ?
Você pode processá-lo também no execute e enviar o valor dele.

O que acontece é que quando clico no checkbox, não é disparado o evento que pega os valores da tela e seta para o bean. A ação é diferente da ação que um button executa, por exemplo.

Nem mesmo no d.getRowData(); tem o texto digitado.

Para entender melhor.

Nesta imagem eu adiciono um nova linha.

Nesta imagem eu adiciono o texto no campo informações do produto.

Após digitar o texto clico no checkbox desta mesma linha, que no caso é a última.

Quando eu faço essa última ação, eu chamo o método trocaProdutoPadrao(), e depois de fazer essa troca, é feito um update na datatable. Quando é feito esse update, o texto digitado é perdido, pois ele ainda não está salvo no this.getProdutosAdministradora(), que é de onde é pego os dados para exibir na tela.

if (!(prodAdmin == linhaAtual)) { Não seria melhor deixar if (prodAdmin != linhaAtual) { ou até inverter os blocos de código?

Por que você não usa a seleção única da tabela que o primefaces já fornece?

http://www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf

[quote=Rodrigo Sasaki] if (!(prodAdmin == linhaAtual)) { Não seria melhor deixar if (prodAdmin != linhaAtual) { ou até inverter os blocos de código?

Por que você não usa a seleção única da tabela que o primefaces já fornece?

http://www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf

[/quote]Na boa… estou pensando isso o tempo inteiro enquanto lia esse post… O.O

[quote=Rodrigo Sasaki] if (!(prodAdmin == linhaAtual)) { Não seria melhor deixar if (prodAdmin != linhaAtual) { ou até inverter os blocos de código?
[/quote]

Sim sim. É que antes eu estava usando equals, ai por isso estava negando na frente. Só que no bean estou implementando o equals e hashcode, ai não funciona com o equals. Ai quando mudei nem me toquei nisto.

E quanto ao componente?

[quote=Hebert Coelho][quote=Rodrigo Sasaki] if (!(prodAdmin == linhaAtual)) { Não seria melhor deixar if (prodAdmin != linhaAtual) { ou até inverter os blocos de código?

Por que você não usa a seleção única da tabela que o primefaces já fornece?

http://www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf

[/quote]Na boa… estou pensando isso o tempo inteiro enquanto lia esse post… O.O[/quote]

[code]public String trocaProdutoPadrao() {
final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
.findComponent(":formForm:tabView:tabelaProdutoAdministradoraDataTable");

	ProdutoAdministradora linhaAtual = (ProdutoAdministradora)d.getRowData();
	
	for (ProdutoAdministradora prodAdmin : this.getProdutosAdministradora()) {
		
		if (prodAdmin != linhaAtual) {
			prodAdmin.setProdutoPadrao(false);
		} else {
			prodAdmin.setProdutoPadrao(true);
		}
	}
	
	return null;
}[/code]

Pronto.

Não entendi, o que sobrescrever equals e hashcode tem a ver? Deveria funcionar da mesma maneira.

Aliás, se não sobrescrevesse equals aí sim que não deveria funcionar com equals, a não ser que seja o mesmo objeto.

Já havia pensado nessa possibilidade. O datatable que estou utilizando foi customizado, e está sendo utilizado em vários lugares, não sei qual o impacto que terá utilizando isto. preciso analisar isso.

Não entendi, o que sobrescrever equals e hashcode tem a ver? Deveria funcionar da mesma maneira.

Aliás, se não sobrescrevesse equals aí sim que não deveria funcionar com equals, a não ser que seja o mesmo objeto.[/quote]

É por que no momento que eu comparo, ainda não tem valor para os campos que estão sendo comparados no equals, eles estão null. Desta forma todos os objetos são iguais nessa comparação.

Bom, tudo bem :slight_smile:

E quanto à sugestão do componente? Não seria muito mais fácil utilizar o que o primefaces já fornece?

Bom, tudo bem :slight_smile:

E quanto à sugestão do componente? Não seria muito mais fácil utilizar o que o primefaces já fornece?[/quote]

Acho que vai dar pra utilizar sim. Depois posto se consegui resolver.

obrigado.

Consegui resolver utilizando http://www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf
Obrigado.