25
08
2009
Carregar selectOneMenu ao escolher um outro selectOneMenu?
Em JSF, como carregar um combo de cidades ao escolher um estado em um combo?
A solução que mais gosto é o ValueChangeListener. O ValueChangeListener faz uma requisição a um bean no momento que um determinado valor for alterado, no caso o estado.
Um exemplo:
Combo de estado:
<h:selectOneMenu id="tipo" value="#{meuController.endereco.estado}" valueChangeListener="#{meuController.trocaCidadesEstado}" >
<f:selectItems value="#{meuController.listaEstados}" />
</h:selectOneMenu>
Combo de cidades:
<h:selectOneMenu id="tipo" value="#{meuController.endereco.cidade}" >
<f:selectItems value="#{meuController.listaCidades}" />
</h:selectOneMenu>
MeuBean.java
/**
* Listener que atualiza o combo de cidades dependendo do estado escolhido
*
* @param event
*/
public void trocaCidadesEstado(ValueChangeEvent event) {
// garantindo que o valor do combo de estados mudou
if (event.getNewValue() != event.getOldValue()) {
List<Cidade> lista = new ArrayList<Cidade>();
try {
lista = cidadesService.findCidadesByEstado(event.getNewValue().toString());
} catch (Exception e) {
...
}
this.listaCidades = MeuUtil.montaSelectItems(lista);
}
}
