6
respostas

Duas listas em jsf

Tenho esta lista

<p:selectOneMenu id="entidade" effect="fade" var="t" filter="true"
filterMatchMode="startsWith">
<f:selectItem itemLabel="Selecione uma entidade..." itemValue="" />
<f:selectItems
value="#{declaracaocontroller.buscaEntidadesUsuarioLogado}"
var="entidade" itemLabel="#{entidade.municpio.codigoNome}"
itemValue="#{entidade}" />
<p:column>
<h:outputText value="#{t.municpio.codigoNome}" />
</p:column>
</p:selectOneMenu>

Com a opção escolhida e sem o usuário clicar em um botão, preciso que carregue as informações segunda lista.

<p:outputLabel for="contribuinte" value="Contribuinte" />
<p:selectOneMenu id="contribuinte" effect="fade" var="t"
filter="true" filterMatchMode="startsWith">
<f:selectItem itemLabel="Selecione um contribuinte..." itemValue="" />
<f:selectItems
value="#{declaracaocontroller.buscaEntidadesUsuarioLogado}"
var="entidade" itemLabel="#{entidade.municpio.codigoNome}"
itemValue="#{entidade}" />
<p:column>
<h:outputText value="#{t.municpio.codigoNome}" />
</p:column>
</p:selectOneMenu>

Fiz algumas pesquisas e alguns testes mas sem sucesso.

6 respostas

vc precisa adicionar um evento no primeiro combo que vai chamar um metodo no seu managedbean.. esse metodo vai popular um atributo que vai ser recuperado pelo metodo na segunda listagem. Pode fazer via ajax tb, se quiser.

Tenta fazer o codigo e posta aqui as alteracoes com as duvidas.

Então fiz assim:

no primeiro componente ficou assim:

<p:selectOneMenu id="entidade" effect="fade" var="t" filter="true"
                filterMatchMode="startsWith">
                <f:selectItem itemLabel="Selecione uma entidade..." itemValue="" />
                <f:selectItems
                    value="#{declaracaocontroller.buscaEntidadesUsuarioLogado}"
                    var="entidade" itemLabel="#{entidade.municpio.codigoNome}"
                    itemValue="#{entidade}" />
                <p:column>
                    <h:outputText value="#{t.municpio.codigoNome}" />
                </p:column>
                <p:ajax event="itemSelect" update="outEntidadeEscolhida" />
            </p:selectOneMenu>

Aonde tem este evento ajax:

<p:ajax event="itemSelect" update="outEntidadeEscolhida" />

Que faz o update neste componente

<h:outputText id="outEntidadeEscolhida"
            value="#{declaracaocontroller.carregarContribuinte()}" />

Que chama este metodo:

public Set<?> carregarContribuinte() {
        FacesContext face = FacesContext.getCurrentInstance();
        getEntidades();
        UsuarioEntity usuarioLogado = new UsuarioEntity();
        usuarioLogado.setId(1l);
        return entidades;
    }

Ai não consegui pegar o que foi escolhido pelo usuário.

Mas após escolher um valor ele chega neste metodo:

carregarContribuinte()

Tentei assim também

<p:selectOneMenu id="entidade" effect="fade" var="t" filter="true" filterMatchMode="startsWith" converter="entidadeConverter" value="#{declaracaocontroller.entidade}">
<f:selectItem itemLabel="Selecione uma entidade..." itemValue="" />
<f:selectItems value="#{declaracaocontroller.buscaEntidadesUsuarioLogado}"
 var="entidade" itemLabel="#{entidade.municpio.codigoNome}" itemValue="#{entidade}" />
<p:column>
<h:outputText value="#{t.municpio.codigoNome}" />
</p:column>
</p:selectOneMenu>

Mas nunca chama value="#{declaracaocontroller.entidade}"

Converter

 package org.desif.converter;

    import java.util.Map;

    import javax.faces.application.FacesMessage;
    import javax.faces.component.UIComponent;
    import javax.faces.context.FacesContext;
    import javax.faces.convert.Converter;
    import javax.faces.convert.ConverterException;
    import javax.faces.convert.FacesConverter;

    import org.desif.controller.desif.DeclaracaoController;
    import org.desif.model.desif.EntidadeEntity;

    @FacesConverter("entidadeConverter")
    public class EntidadeConverter implements Converter {

        @SuppressWarnings("unchecked")
        @Override
        public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
            if (value != null && value.trim().length() > 0) {
                try {
                    DeclaracaoController service = (DeclaracaoController) fc.getExternalContext().getApplicationMap()
                            .get("themeService");
                    return ((Map<String, Object>) service.getEntidades()).get(Integer.parseInt(value));
                } catch (NumberFormatException e) {
                    throw new ConverterException(
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro !!!", "Não existe esta entidade !"));
                }
            } else {
                return null;
            }
        }

        @SuppressWarnings("null")
        @Override
        public String getAsString(FacesContext fc, UIComponent uic, Object object) {
            if (!object.toString().isEmpty()) {
                return String.valueOf(((EntidadeEntity) object).getId());
            } else {
                return null;
            }
        }
    }

Onde posso estar errando ?

Então aonde posso estar errando ?

o seu metodo getContribuinte nao parece fazer uso de nada que foi escolhido no select anterior.. acho que o erro esta ali.

Não achei o getContribuinte ...