Combos em cascata (JSF2 + Primefaces)

Olá pessoal.

Estou enfrentando problemas para fazer 3 combos aninhados.

São eles. UF -> Cidade -> Unidades (Empresas)

Consegui fazer o combo Uf para Cidade, mas de Cidade para Unidade não dá. Procurei muito realmente mas mesmo assim não consegui, por isso estou pedindo ajuda no forum.

Codigos:

ManageBean:

@Named(value = "memoMNG")
@RequestScoped
public class MemorandoMNG implements Serializable {

    @EJB
    MemorandoDAORemote dao;
    private String id;
    private String numeroNacional;
    private String assunto;
    private String status;
    private String texto;
    private Memorando memoPai;
    // destinatario
    private Uf comboUf;
    private Cidade cidadeTemp;
    private Cidade comboCidade;
    private Unidade comboUnidade;
    private SelectOneMenu cmbCidade;
    private SelectOneMenu cmbUnidade;

     public List<Uf> getListaComboUf() {
        List<Uf> lista = new ArrayList<Uf>();

        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        UfMNG neededBean = (UfMNG) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "ufMNG");

        for (Uf uf : neededBean.getListaTodos()) {  // AQUI LISTA TODOS MEUS UFS
            lista.add(uf);
        }

        return lista;
    }

    public List<Cidade> getListaComboCidade() {
        List<Cidade> lista = new ArrayList<Cidade>();

        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        CidadeMNG cidadeMNG = (CidadeMNG) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "cidadeMNG");

        if (!this.cmbCidade.isDisabled()) {
            for (Cidade cid : cidadeMNG.getListaPorUf(comboUf)) { // AQUI LISTA SOMENTE AS CIDADES QUE TEM O UF COMO SEU "PAI"
                lista.add(cid);
            }
        }

        return lista;
    }

    public void atualizaComboCidade() {
        this.cmbCidade.setDisabled(false);
        System.out.println("--------%%%%%%%");
        System.out.println(comboUf);

    }

    public List<Unidade> getListaComboUnidade() {
        List<Unidade> lista = new ArrayList<Unidade>();

        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        UnidadeMNG unidadeMNG = (UnidadeMNG) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "unidadeMNG");


        if (!this.cmbUnidade.isDisabled()) {
            for (Unidade uni : unidadeMNG.getListaPorCidade(comboCidade)) {
                // for (Unidade uni : unidadeMNG.getListaTodos()) {
                lista.add(uni);
            }
        }

        return lista;
    }

    public void atualizaComboUnidade() {
        this.cmbUnidade.setDisabled(false);
        System.out.println(" cidade-------- ####");
        System.out.println(comboCidade);
    }

// ... gets sets metodos diversos

XHTML:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <ui:composition template="/WEB-INF/templates/default.xhtml">
        <ui:define name="conteudo">
            <f:view contentType="text/html" encoding="UTF-8">
                <h:form id="formMemo">
                    <p:fieldset legend="Criar Memorando" style="width: 50%">
                        <p:selectOneMenu id="cmbUf" value="#{memoMNG.comboUf}"
                                         converter="ufConverter" style="width: 160px; height: 22px">
                            <f:selectItems value="#{memoMNG.listaComboUf}" var ="vCmbUf"
                                           itemLabel="#{vCmbUf.nome}" itemValue="#{vCmbUf}"/>
                            <p:ajax update="cmbCidade" listener="#{memoMNG.atualizaComboCidade}" immediate="true" />
                        </p:selectOneMenu>

                        <p:selectOneMenu id="cmbCidade" disabled="true"  value="#{memoMNG.comboCidade}"
                                         converter="cidadeConverter" binding="#{memoMNG.cmbCidade}" style="width: 160px; height: 22px">
                            <f:selectItems value="#{memoMNG.listaComboCidade}" var ="vCmbCid"
                                           itemLabel="#{vCmbCid.nome}" itemValue="#{vCmbCid}"/>
                            <p:ajax update="cmbUnidade" listener="#{memoMNG.atualizaComboUnidade}" immediate="true"/>
                        </p:selectOneMenu>

                        <p:selectOneMenu id="cmbUnidade" disabled="true" value="#{memoMNG.comboUnidade}"
                                         converter="unidadeConverter" binding="#{memoMNG.cmbUnidade}" style="width: 160px; height: 22px">
                            <f:selectItems value="#{memoMNG.listaComboUnidade}" var ="vCmbUni"
                                           itemLabel="#{vCmbUni.nome}" itemValue="#{vCmbUni}"/>
                        </p:selectOneMenu>
                   </p:fieldset>
                </h:form>
            </f:view>
        </ui:define>
    </ui:composition>
</html>

Não funciona quando faço para a UNIDADE.

Alguem tem alguma dica?

Obrigado

cara,

seta a propriedade para p:ajax com event=“change” e ve se funciona, aqui no meu funciona… :smiley:

t+

Já coloquei e não deu.

Mesmo sem, o primeiro combo faz certo. Problema é pegar o valor do segundo combo e passar como paremetro para buscar o terceiro.

Teria como colocar teu codigo?

Cara,

no codigo eu tenho 2 combo e funciona, mas no seu caso vc pode testar se funciona com valuechangelistener e implementar esse metodo para pegar o valor do combo

No site do primefaces, peguei um exemplo e adicionei umas coisas.

Ficou assim:

package br.gov.dpu.jsf.mng;

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

@Named(value = "testeMNG")
@RequestScoped
public class TesteMNG implements Serializable {

    private String uf;
    private String cidade;
    private String bairro;
    private Map<String, String> ufs = new HashMap<String, String>();
    private Map<String, Map<String, String>> cidadesData = new HashMap<String, Map<String, String>>();
    private Map<String, String> cidades = new HashMap<String, String>();
    private Map<String, String> bairros = new HashMap<String, String>();
    private Map<String, Map<String, String>> bairrosData = new HashMap<String, Map<String, String>>();

    public TesteMNG() {
        ufs.put("RS", "RS");
        ufs.put("SC", "SC");
        ufs.put("SP", "SP");
        
        cidades.put("PELOTAS", "PELOTAS");
        cidades.put("POA", "POA");

        bairros.put("FRAGATA", "FRAGATA");
        bairros.put("CENTRO", "CENTRO");

        cidadesData.put("RS", cidades);

        bairrosData.put("POA", bairros);
    }

    public void atualizaCidades() {
        if (uf != null && !uf.equals("")) {
            cidades = cidadesData.get(uf);
        } else {
            cidades = new HashMap<String, String>();
        }
    }

    public void atualizaBairros() {
            if (cidade != null && !cidade.equals("")) {
            bairros = bairrosData.get(cidade);
        } else {
            bairros = new HashMap<String, String>();
        }
    }

    public void mostrarSelecao() {
        FacesMessage msg = new FacesMessage("Selecionados", "UF:" + uf + " , Cidade: " + cidade + " , Bairro: " + bairro);
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public Map<String, String> getBairros() {
        return bairros;
    }

    public void setBairros(Map<String, String> bairros) {
        this.bairros = bairros;
    }

    public Map<String, Map<String, String>> getBairrosData() {
        return bairrosData;
    }

    public void setBairrosData(Map<String, Map<String, String>> bairrosData) {
        this.bairrosData = bairrosData;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public Map<String, String> getCidades() {
        return cidades;
    }

    public void setCidades(Map<String, String> cidades) {
        this.cidades = cidades;
    }

    public Map<String, Map<String, String>> getCidadesData() {
        return cidadesData;
    }

    public void setCidadesData(Map<String, Map<String, String>> cidadesData) {
        this.cidadesData = cidadesData;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    public Map<String, String> getUfs() {
        return ufs;
    }

    public void setUfs(Map<String, String> ufs) {
        this.ufs = ufs;
    }
}
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <ui:composition template="/WEB-INF/templates/default.xhtml">
        <ui:define name="conteudo">
            <f:view contentType="text/html" encoding="UTF-8">
                <h:form>
                    
                    <p:growl id="msgs" showDetail="true"/>

                    <p:panel header="Combos em cascata">
                        <h:panelGrid columns="3" cellpadding="5">
                            <p:selectOneMenu id="ufs" value="#{testeMNG.uf}">
                                <f:selectItem itemLabel="UF..." itemValue="" />
                                <f:selectItems value="#{testeMNG.ufs}" />
                                <p:ajax update="cidades"
                                        listener="#{testeMNG.atualizaCidades}" />
                            </p:selectOneMenu>

                            <p:selectOneMenu id="cidades" value="#{testeMNG.cidade}">
                                <f:selectItem itemLabel="Cidade..." itemValue="" />
                                <f:selectItems value="#{testeMNG.cidades}" />
                                <p:ajax update="bairros"
                                        listener="#{testeMNG.atualizaBairros}" />
                            </p:selectOneMenu>

                            <p:selectOneMenu id="bairros" value="#{testeMNG.bairro}">
                                <f:selectItem itemLabel="Bairro..." itemValue="" />
                                <f:selectItems value="#{testeMNG.bairros}" />
                            </p:selectOneMenu>
                        </h:panelGrid>

                        <p:commandButton value="selecionar" update="msgs" actionListener="#{testeMNG.mostrarSelecao}"/>

                    </p:panel>

                </h:form>
            </f:view>
        </ui:define>
    </ui:composition>
</html>

Só que tudo é texto. Preciso fazer meus Lists do BD.

E testar :wink:

PS: tomara que funcione.

ta a msm coisa que vc fez…rsrs
mas caso não funcione, pode testar com o valuechangelistener

t+

Pois é, não tem uma “diferença” mas tem hehehhe. aff!

Fiz o que você disse, também fica null.

ve esse exemplo ai


http://www.mkyong.com/jsf2/jsf-2-valuechangelistener-example/

t+

Fazendo o Listener, o valor vem null.

aff

Caso alguem passe pelo mesmo meu problema:

eis a solução:

PS: se é a mais correta NÃO sei. Mas funciono. Otimização e qualidade vou fazer agora que sei que funciona.

package br.gov.dpu.jsf.mng;

import br.gov.dpu.jpa.bean.Cidade;
import br.gov.dpu.jpa.bean.Uf;
import br.gov.dpu.jpa.bean.Unidade;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.el.ELContext;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.primefaces.component.selectonemenu.*;

@Named(value = "testeMNG")
@RequestScoped
public class TesteMNG implements Serializable {

    private Uf uf;
    private Cidade cidade;
    private Unidade unidade;
    private Map<Uf, Uf> ufs = new HashMap<Uf, Uf>();
    private Map<Uf, Map<Cidade, Cidade>> cidadesData = new HashMap<Uf, Map<Cidade, Cidade>>();
    private Map<Cidade, Cidade> cidades = new HashMap<Cidade, Cidade>();
    private Map<Unidade, Unidade> unidades = new HashMap<Unidade, Unidade>();
    private Map<Cidade, Map<Unidade, Unidade>> unidadesData = new HashMap<Cidade, Map<Unidade, Unidade>>();
    // binding

    public TesteMNG() {

        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        UfMNG ufMNG = (UfMNG) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "ufMNG");
        CidadeMNG cidadeMNG = (CidadeMNG) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "cidadeMNG");
        UnidadeMNG unidadeMNG = (UnidadeMNG) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "unidadeMNG");

        // INSERE TODOS ESTADOS

        for (Uf listaUF : ufMNG.getListaTodos()) {
            ufs.put(listaUF, listaUF);
            System.out.println("----------------- ESTADO LIDO: " + listaUF.getNome());

            Map<Cidade, Cidade> cidadesTemp = new HashMap<Cidade, Cidade>();
            for (Cidade listaCIDADE : cidadeMNG.getListaPorUf(listaUF)) {
                System.out.println("----------------- CIDADE LIDA: " + listaCIDADE.getNome());
                cidadesTemp.put(listaCIDADE, listaCIDADE);
                cidades.put(listaCIDADE, listaCIDADE);

                Map<Unidade, Unidade> unidadesTemp = new HashMap<Unidade, Unidade>();
                for (Unidade listaUNI : unidadeMNG.getListaPorCidade(listaCIDADE)) {
                    System.out.println("----------------- UNIDADE LIDA: " + listaUNI.getNome());
                    unidadesTemp.put(listaUNI, listaUNI);
                    unidades.put(listaUNI, listaUNI);
                }
                unidadesData.put(listaCIDADE, unidadesTemp);
            }
             cidadesData.put(listaUF, cidadesTemp);
        }


//        ufs.put("RS", "RS");
//
//        Map<String, String> cidadesRS = new HashMap<String, String>();
//        cidadesRS.put("PELOTAS", "PELOTAS"); cidades.put("PELOTAS", "PELOTAS");
//
//        Map<String, String> unidadesPEL = new HashMap<String, String>();
//        unidadesPEL.put("UNI 1", "UNI 1");unidades.put("UNI 1", "UNI 1");
//        unidadesPEL.put("UNI 2", "UNI 2"); unidades.put("UNI 2", "UNI 2");
//        unidadesPEL.put("UNI 3", "UNI 3");unidades.put("UNI 3", "UNI 3");
//        unidadesData.put("PELOTAS", unidadesPEL);
//
//        cidadesRS.put("PORTO ALEGRE", "PORTO ALEGRE");cidades.put("PORTO ALEGRE", "PORTO ALEGRE");
//        Map<String, String> unidadesPOA = new HashMap<String, String>();
//        unidadesPOA.put("UNI POA 1", "UNI POA 1");unidades.put("UNI POA 1", "UNI POA 1");
//        unidadesPOA.put("UNI POA 2", "UNI POA 2");unidades.put("UNI POA 2", "UNI POA 2");
//        unidadesPOA.put("UNI POA 3", "UNI POA 3"); unidades.put("UNI POA 3", "UNI POA 3");
//        unidadesData.put("PORTO ALEGRE", unidadesPOA);
//
//        cidadesRS.put("SANTA MARIA", "SANTA MARIA");cidades.put("SANTA MARIA", "SANTA MARIA");
//
//        cidadesData.put("RS", cidadesRS);



//        ufs.put("SC", "SC");
//        ufs.put("SP", "SP");
//        Map<String, String> cidadesSC = new HashMap<String, String>();
//        Map<String, String> cidadesSP = new HashMap<String, String>();
//        cidadesSC.put("FLORIPA", "FLORIPA");cidades.put("FLORIPA", "FLORIPA");
//        cidadesSC.put("ITAJAI", "ITAJAI");cidades.put("ITAJAI", "ITAJAI");
//        cidadesSC.put("BLUMENAU", "BLUMENAU");cidades.put("ITAJAI", "ITAJAI");
//        cidadesData.put("SC", cidadesSC);
//        cidadesSP.put("1", "1");cidades.put("1", "1");
//        cidadesSP.put("2", "2");cidades.put("2", "2");
//        cidadesSP.put("3", "3");cidades.put("3", "3");
//        cidadesData.put("SP", cidadesSP);
//

    }

    public void atualizaCidades() {

        cidades = cidadesData.get(uf);


    }

    public void atualizaUnidades() {

        unidades = unidadesData.get(cidade);



    }

    public void mostrarSelecao() {
        FacesMessage msg = new FacesMessage("Selecionados", "UF:" + uf + " , Cidade: " + cidade + " , Unidade: " + unidade);
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    public Map<Cidade, Cidade> getCidades() {
        return cidades;
    }

    public void setCidades(Map<Cidade, Cidade> cidades) {
        this.cidades = cidades;
    }

    public Map<Uf, Map<Cidade, Cidade>> getCidadesData() {
        return cidadesData;
    }

    public void setCidadesData(Map<Uf, Map<Cidade, Cidade>> cidadesData) {
        this.cidadesData = cidadesData;
    }

    public Uf getUf() {
        return uf;
    }

    public void setUf(Uf uf) {
        this.uf = uf;
    }

    public Map<Uf, Uf> getUfs() {
        return ufs;
    }

    public void setUfs(Map<Uf, Uf> ufs) {
        this.ufs = ufs;
    }

    public Unidade getUnidade() {
        return unidade;
    }

    public void setUnidade(Unidade unidade) {
        this.unidade = unidade;
    }

    public Map<Unidade, Unidade> getUnidades() {
        return unidades;
    }

    public void setUnidades(Map<Unidade, Unidade> unidades) {
        this.unidades = unidades;
    }

    public Map<Cidade, Map<Unidade, Unidade>> getUnidadesData() {
        return unidadesData;
    }

    public void setUnidadesData(Map<Cidade, Map<Unidade, Unidade>> unidadesData) {
        this.unidadesData = unidadesData;
    }   
}