[RESOLVIDO] <p:selectBooleanCheckbox> evento ao clicar (tikar o quadradinho)

Galera boa noite! Estou com uma pedra no meu sapato já faz 2 dias, conto com a ajuda de voceis em =D.

IDEIA: Estou desenvolvendo um sistema onde uma pessoa possa ter vários endereços. Criei a seguinte regra. "Que dentro de todos os endereços de uma empresa, devera ser especificado um endereço como sendo o principal, para que possa utilizado em impressões etc. Atributo este definido como String(length = 1)

PROBLEMA:Em minha tela de cadastro de empresa(herda pessoa) eu listo todos os endereços dessa empresa, onde lá eu posso incluir , excluir , alterar. Ao realizar a inclusão ou alteração de um endereço, eu chamo uma dialog para fazer esta inclusão ou alteração. Nesta dialo possuo um <p:selectBooleanCheckbox> que define o endereço como sendo principal.

O que necessito validar neste <p:selectBooleanCheckbox>.

  • Se já existe algum outro endereço sendo Principal (devendo bloquear o campo para que não seja possível marca-lo) - OK
  • Se o endereço que escolhi para alterar é o endereço principal. (devendo deixar o campo liberado caso queira desmarca-lo como principal) - OK
    * Ao clicar no campo devo automaticamente definir o endereço como principal. - OK

O meu problema começa realmente nesta parte:

Eu já criei os metodos para validar os 3 itens citados acima. Mas não consigo fazer a chamada do metodo ao clicar no evento.

Vou colocar como está meu dialog a baixo e o que eu já tentei fazer:

Dialog:

<p:dialog id="modalEndereco" header="Cadastro de Endereço" widgetVar="modEnd" appendToBody="true" resizable="false" modal="true"> <h:form> <p:panelGrid id="pnCadEnd"> <p:row> <p:column style="text-align: right;">Tipo Endereco:</p:column> <p:column style="text-align: left;"> <h:selectOneMenu style="width:150px" value="#{empresaController.endereco.tpEndereco}"> <f:selectItem itemLabel="Tipo Endereço" itemDisabled="true"/> <f:selectItems value="#{empresaController.endereco.tpEndereco.tipos}"/> </h:selectOneMenu> </p:column> <p:column style="text-align: left;"> <h:outputLabel value="Endereço Principal?: "/> <p:selectBooleanCheckbox value="#{empresaController.isEnderecoPrincipal()}" disabled="#{empresaController.checaEnderecoPrincipal()}"> <p:ajax event="click" listener="#{empresaController.setaEnderecoPrincipal()}"/> </p:selectBooleanCheckbox> </p:column> </p:row> <p:row> <p:column style="text-align: right;">Cep:</p:column> <p:column style="text-align: left;" colspan="2"> <p:inputMask mask="99999-999" value="#{empresaController.endereco.cep}"/> </p:column> </p:row> <p:row> <p:column style="text-align: right;">Logradouro:</p:column> <p:column colspan="2"> <p:inputText value="#{empresaController.endereco.endereco}" size="80"/> </p:column> </p:row> <p:row> <p:column style="text-align: right;">Número:</p:column> <p:column style="text-align: left;" colspan="2"> <p:inputText value="#{empresaController.endereco.num}" size="8" /> </p:column> </p:row> <p:row> <p:column style="text-align: right;">Cidade:</p:column> <p:column colspan="2" style="text-align: left;"> <h:selectOneMenu style="width:200px" value="#{empresaController.endereco.cidade}" converter="#{enderecoController.converterCidade}"> <f:selectItem itemLabel="Escolha uma Cidade" itemDisabled="true"/> <f:selectItems value="#{enderecoController.cidades}"/> </h:selectOneMenu> </p:column> </p:row> <p:row> <p:column style="text-align: right;">Bairro:</p:column> <p:column colspan="2" style="text-align: left;"> <h:selectOneMenu style="width:200px" value="#{empresaController.endereco.bairro}" converter="#{enderecoController.converterBairro}"> <f:selectItem itemLabel="Escolha um Bairro" itemDisabled="true"/> <f:selectItems value="#{enderecoController.bairros}"/> </h:selectOneMenu> </p:column> </p:row> <p:row> <p:column style="text-align: right;">Complemento:</p:column> <p:column colspan="2" style="text-align: left;"> <p:inputText value="#{empresaController.endereco.complemento}" size="80"/> </p:column> </p:row> </p:panelGrid> <br/> <p:separator/> <p:commandButton value="Salvar" immediate="true" actionListener="#{empresaController.salvarEndereco}" update=":form_cadastro" oncomplete="modEnd.hide()" icon="btn_salvar"/> <p:commandButton value="Cancelar" immediate="true" icon="btn_cancela" oncomplete="modEnd.hide()"/> </h:form> </p:dialog>

Metodos no MB

[code] // Metodo que checa se existe dentro todos os endereços algum endereço principal
public boolean checaEnderecoPrincipal() {
boolean resultado = false;
if (endereco != null) {
for (Endereco end : empresa.getEndereco()) {
if (end.getStatus_principal().equals(“S”)) {
resultado = true; // se achar é para bloquear o campo
break;
} else {
resultado = false; // se nao achar libera para poder setar
}
}
if (endereco.getStatus_principal().equals(“S”)){
resultado = false;
} // se o usuario selecionado for o endereco principal deve ficar
// liberado para poder desmarcar
} else {
resultado = true;
}
return resultado;
}

// Metodo que traz o checkbox marcado caso ele tenha escolhido o endereço principal
public boolean isEnderecoPrincipal() {
    if (endereco != null) {
        if (endereco.getStatus_principal().equals("S")) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

// Metodo a ser chamado no evento ao clicar no checkbox
public void setaEnderecoPrincipal() {
    if (endereco != null) {
        if (endereco.getStatus_principal().equals("S")) {
            endereco.setStatus_principal("N");
        } else {
            endereco.setStatus_principal("S");
        }
    }
}[/code]

Nesta seguinte situação o checkbox esta validando na chamada da janela, mas o evento do <p:selectBooleanCheckbox> nao chama (não faz nada) e o salvar tambem nao está fazendo nada!!

se alterar a propriedade <p:selectBooleanCheckbox> deixando sem value e o <p:ajax> sem event igual está no site do primefaces

<p:selectBooleanCheckbox disabled="#{empresaController.checaEnderecoPrincipal()}"> <p:ajax listener="#{empresaController.setaEnderecoPrincipal()}"/> </p:selectBooleanCheckbox>

o Salvar funciona, o evento de clicar no checkbox tambem funciona, MAS NÃO CONSIGO TRAZER EN TELA O BENDITO DO CHECKBOX MARCADO.

já tentei colocar o metodo do click recebendo parametro de AjaxBehaviorEvent.

já tentei colocar o <p:ajax> como immediate.

Não sei o que fazer, já pensei em nao executar evento algum ao clicar e tentar recuperar o estado do checkbox diretamente pelo MB.

Se alguem tiver a solução,
Se alguem tiver uma maneira melhor de trabalhar com + de 1 endereço,
Se alguem mandar eu mudar toda esta ideia louca, e fazer apenas com um endereço.

Estou aceitando responstas… Grato =D

Já resolvi, defini o atributo como do tipo boleano e atribui pro value do checkbox. Pois verifiquei que o checkbox ja trata automaticamente em quando marcalo/desmarcalo alterar o valor do atributo para true e false.