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?
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?
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.
[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.
[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?
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.