Se estiver usando richfaces, tente isso:
<a4j:support event="onchange" action="#{meuBean.selecionaCidades}" reRender="tabelaCidades" />
Se estiver usando richfaces, tente isso:
<a4j:support event="onchange" action="#{meuBean.selecionaCidades}" reRender="tabelaCidades" />
Cara, você tem duas opções.
Olá pessoal.
Procurei em tudo que é canto e não achei nada a respeito e tentei de tudo que é jeito que podia imaginar e não consegui…
Objetivo: Filtrar cidades de um MBean por estado selecionado.
Vejam o que quero fazer:
Selecionar o estado e executar a ação valueChangeListener.
<h:selectOneMenu id="siglaEstado" value="#{Cidades.sigEst}" immediate="true" valueChangeListener="#{Cidades.valueChangeListener}" >
<f:selectItem itemLabel="Acre" itemValue="AC" />
<f:selectItem itemLabel="Amapá" itemValue="AP" />
........
</h:selectOneMenu>
A ação preenche uma lista de cidades filtrando pelo estado selecionado.
public String estadoSelecionado;
public List<Cidades> listCodCi = new ArrayList<Cidades>();
public void valueChangeListener(ValueChangeEvent event) {
System.out.println("novo estado selecionado: " + event.getNewValue());
estadoSelecionado = event.getNewValue().toString();
listCodCid = Cidades.buscar(getEstadoSelecionado());
for(int i = 0; i < listCodCid1.size(); i++)
System.out.println("Cidade: " + listCodCid.get(i).getCodCid());
}
O problema é que se eu popular a lista desta maneira, o JSF recebe ela vazia.
Se eu popular ela pelo construtor, o JSF recebe a lista só que sem o filtro, isto é, recebe todas as cidades. Isto porque quando preencho a lista no construtor, o estadoSelecionado está vazio.
O que vocês me sugerem?
Alguém ??
Eu até pensei em passar um parâmetro <f:param, mas não deu muito certo.
O máximo que cheguei foi assim:
Eu selecionava um estado, p. ex: SP.
Pesquisa as cidades e vinha todas de todos os estados.
Depois mudava o estado para, MG p. ex., e vinham as cidades de SP, isto é, sempre considerando o estado anterior selecionado.
É, eu até achei isso, mas não queria usar a4j pra isso.
Onde você disse:
reRender=“tabelaCidades”
Acontece o seguinte:
Eu tenho esta lista para selecionar o estado.
E tem um botão que abre um dialog que tem uma tabela com as cidades, que deverão ser as cidades de acordo com o estado selecionado na lista…
Tens mais sugestões ?
Ninguém ?
Eu acredito que a maioria já passou por isso, pois é algo que é necessário em praticamente todo tipo de aplicação.
Por exemplo:
Você quer listar os carros (em uma tabela) de determinado ano. Esse ano o usuário seleciona em um combo ou radio… Sem bean para o ano.
A lista de Carros (bean) deve considerar o ano que foi selecionado na página…
Eu já tentei de tudo e procurei muito antes de recorrer ao fórum…
Consegui.
Vou deixar aqui para quem precisar…
NetBeans 6.8
GlassFish v3
PrimeFaces 2.0.2
JSF 2 (Mojarra)
Formulário que lista as cidades de acordo com o estado (comboBox) selecionado
<h:selectOneMenu id="estados" value="#{Regiao.estadoSelecionado}" >
<f:selectItem itemLabel="Acre" itemValue="AC" />
<f:selectItem itemLabel="Amapá" itemValue="AP" />
<f:selectItem itemLabel="Amazonas" itemValue="AM" />
...
// Executa o método que carrega as cidades ao mudar o estado
<p:ajax update="formCid:tblCid" process="estados" event="change" actionListener="#{Regiao.actionCarregarCidades}" />
</h:selectOneMenu>
...
// Botão para abrir um dialog que lista as cidades
<p:commandLink value="Listar Cidades" oncomplete="formCid:dialogCid.show()" title="Pesquisar" />
// Formulário na mesma página que abre o dialog com as cidades do estado selecionado
<h:form id="formCid">
<p:dialog header="Cidades" widgetVar="dialogCid" fixedCenter="true"
width="550px" height="420px" modal="true" >
<p:outputPanel style="text-align:center;" layout="block">
<p:dataTable id="tblCid" var="cid" value="#{Regiao.listCodCid}" paginator="true" rows="10"
selectionMode="single" selection="#{Regiao.beanCidades}" loadingMessage="Carregando...">
<p:column>
<f:facet name="header">
<h:outputText value="Código" />
</f:facet>
<h:outputText value="#{cid.codCid}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Nome" />
</f:facet>
<h:outputText value="#{cid.nomCid}" />
</p:column>
</p:dataTable>
<p:commandButton value="Selecionar" update="formDad:cidSel" oncomplete="dialogCid.hide();" />
</p:outputPanel>
</p:dialog>
</h:form>
E abaixo, os métodos do Bean Regiao
@ManagedBean(name = "Regiao")
@RequestScoped
public class Regiao implements Serializable {
public String estadoSelecionado;
public List<Cidades> listCodCid;
public Cidades beanCidades = new Cidades();
... get's e set's
public void actionCarregarCidade() {
this.listCodCid = getListCodCid();
}
public List<R074CID> getListCodCid() {
List<R074CID> cidades;
if(estadoSelecionado != null && estadoSelecionado.length() > 0) {
cidades = beanCidades.buscar(getEstadoSelecionado()); // Estado selecionado que foi setado na linha 01 do formulário
listCodCid = cidades;
return listCodCid;
}
return null;
}
Espero que seja útil.