SelectOneMenu e ValueChangeListener

Olá pessoal,

Algum de vocês teria um modelo ou exemplo prático de uso de ValueChangeListener no SelectOneMenu?? Como por exemplo, no caso básico de UF/Cidade, onde, após escolher a UF em um SelectOneMenu, no Outro me apareçam somente as cidades daquele estado selecionado anteriormente…

Encontrei algumas coisas na net sobre esse assunto, mas todos diferentes, e nenhum ainda funcionou. Eu gostaria, se possível, de um exemplo/modelo/tutorial prático e eficaz.

Agradeço a todos e Feliz Natal!!!

como passei umas duas semanas testando tudo que é receita na internet vou lhe dar essa ajuda.

no blog do rponte encontrei a solucao:
http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/
o converter eh a essencia do negocio, pois tu salva todos os teus objetos na propria selectedItem. o conversor “se vira” em trazer as coisas
soh lembrando pra reescrever os metodos equals e hashCode das entidades envolvidas…

tela.jsp

<a4j:form id="form">
	<h:outputText value="UF:"></h:outputText>
		<h:selectOneMenu id="cbEstado" 
		    value="#{controleCidade.estado}" 
		    valueChangeListener="#{controleCidade.carregaCidades}">
		<f:selectItem itemValue="" itemLabel="Selecione uma Cidade" />
		<f:selectItems value="#{controleCidade.comboEstado}" />
         	<a4j:support event="onchange" ajaxSingle="true" reRender="cbCidade"/>
      </h:selectOneMenu>
					
	<h:outputText value="Cidade:"></h:outputText>					
	<h:selectOneMenu id="cbCidade"
		value="#{controleCidade.cidade}"	
		converter="simpleEntityConverter"
		immediate="true">
		<f:selectItem itemValue="" itemLabel="Selecione uma Cidade" />
		<f:selectItems value="#{controleCidade.comboCidade}" />
	</h:selectOneMenu>	
</a4j:form>

os metodos do managed bean, estou usando uma lista estatica de estados, mas nada impede de faze-la dinamicamente…


public void carregaCidades(ValueChangeEvent e) {
    if (e.getNewValue() != null) {
	pesquisaCidades(e.getNewValue());
    }
}
	
public void pesquisaCidades(Object estado) {		
      // busca as cidades de um estado em uma persistencia qualquer
     List<Cidade> listaCidades = BancoDados.buscarCidadesPorEstado( estado );
    // montando o combo
   comboCidade = new SelectItem[listaCidades.size()];
	for (int i = 0; i < listaCidades.size(); i++) {
			Cidade c = listaCidades.get(i);
			comboCidade[i] = new SelectItem( c , c.getNmCidade() );
	}
}

public void carregaEstados() {
       List<SelectItem> listaUf = new ArrayList<SelectItem>();
			listaUf.add(new SelectItem("SC"));	
			listaUf.add(new SelectItem("PR"));
			listaUf.add(new SelectItem("RS"));	
        comboEstado = listaUf.toArray(new SelectItem[listaUf.size()]);
}

Talvez isso lhe ajude.
[]'s

Da uma olhada
AQUI TCHÊ

Pessoal, agradeço muito a ajuda, vcs sabem como é dificil conseguir ajuda hj em dia, principalmente sobre um assunto tão complicado (pra mim, que sou iniciante em java).

JonathanSSantos, eu já conhecia outros trabalhos do Serjaum, são muito bons. Estou fazendo a implementação sugerida, mas está me retornando uma ServletException: Error reading ‘servicoParaComboBox’.

vou postar meu codigo no bean, no dao e no jsp pra ver se fica mais claro pra vcs me ajudarem:

no Bean===============

[code]public List getServicoParaComboBox() {
// NOVA IMPLEMENTAÇAO DE TESTE
Session session = HibernateUtil.currentSession();

	ServicoDao dao = new ServicoDao(session, Servico.class);

	List<Servico> servicos = dao.pesquisaServicos(this.programa
			.getCod_programa());

	List<SelectItem> lista = new ArrayList<SelectItem>(servicos.size());
	for (Servico s : servicos) {
		lista.add(new SelectItem(s.getCod_servico(), s.getNome()));
	}

	return lista;
}

public void actionCarregaServicos() {
	System.out.println("id do programa selecionado >>> "
			+ this.programa.getCod_programa());

	this.servico = (Servico) this.getServicoParaComboBox(); //TIVE DE COLOCAR O CAST PARA SERVICO, PQ FICAVA DANDO ERRO E PEDINDO PRA MUDAR O servico para List<SelectItem>;
}

[/code]

o DAo========

[code]public class ServicoDao extends Dao {

public ServicoDao(Session session, Class<Servico> classe) { //no tutorial do serjaum, ele recomendou usar Class<?> classe, aqui não deu certo
	super(session, classe);
}

@SuppressWarnings("unchecked")
public List<Servico> getServicoByPrograma(Long id) { // esse foi o método do serjaum... deu a ServletException
	Query q = session.createQuery("select c from "
			+ Servico.class.getName()
			+ " as c where c.programa.id like :id");
	q.setParameter("id", id);

	return q.list();
}

@SuppressWarnings("unchecked")
public List<Servico> pesquisaServicos(Long id) { //esse eu adaptei para teste, usando criteria, mas deu a mesma ServletException
	Criteria c = session.createCriteria(Servico.class);
	c.add(Restrictions.ilike("id", "%" + id + "%"));

	return c.list();
}

}
[/code]

jsp==========

[code]<h:outputLabel for=“programa” value=“Programa: " />
<h:selectOneMenu value=”#{unidadeHandler.programaSelecionado}" valueChangeListener="#{unidadeHandler.atualizaDataTable}" >
<f:selectItem itemValue=“2” id=“p” itemLabel=“Selecione”/>
<f:selectItems value="#{unidadeHandler.programaParaComboBox}" />
<a4j:support event=“onchange” ajaxSingle=“true” action="#{unidadeHandler.actionCarregaServicos}" reRender=“programa,servico”/>
</h:selectOneMenu>

	<h:outputLabel for="servico" value="Serviço: " />
		<h:selectOneMenu binding="#{unidadeHandler.servicoSelecionado}">
		<f:selectItem itemValue="3" itemLabel="Selecione"/>
			<f:selectItems value="#{unidadeHandler.servicoParaComboBox}" /> //ELE APRESENTA O ERRO NESSA LINHA!!!!
		</h:selectOneMenu>
	[/code]

eae pessoal, alguma luz no fim do túnel???

Feliz Natal e um Próspero ano novo a todos!!!

Eae pessoal, alguma ajuda??

Alguem??

[quote=a.zanona]como passei umas duas semanas testando tudo que é receita na internet vou lhe dar essa ajuda.

no blog do rponte encontrei a solucao:
http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/
o converter eh a essencia do negocio, pois tu salva todos os teus objetos na propria selectedItem. o conversor “se vira” em trazer as coisas
soh lembrando pra reescrever os metodos equals e hashCode das entidades envolvidas…

tela.jsp

<a4j:form id="form">
	<h:outputText value="UF:"></h:outputText>
		<h:selectOneMenu id="cbEstado" 
		    value="#{controleCidade.estado}" 
		    valueChangeListener="#{controleCidade.carregaCidades}">
		<f:selectItem itemValue="" itemLabel="Selecione uma Cidade" />
		<f:selectItems value="#{controleCidade.comboEstado}" />
         	<a4j:support event="onchange" ajaxSingle="true" reRender="cbCidade"/>
      </h:selectOneMenu>
					
	<h:outputText value="Cidade:"></h:outputText>					
	<h:selectOneMenu id="cbCidade"
		value="#{controleCidade.cidade}"	
		converter="simpleEntityConverter"
		immediate="true">
		<f:selectItem itemValue="" itemLabel="Selecione uma Cidade" />
		<f:selectItems value="#{controleCidade.comboCidade}" />
	</h:selectOneMenu>	
</a4j:form>

os metodos do managed bean, estou usando uma lista estatica de estados, mas nada impede de faze-la dinamicamente…


public void carregaCidades(ValueChangeEvent e) {
    if (e.getNewValue() != null) {
	pesquisaCidades(e.getNewValue());
    }
}
	
public void pesquisaCidades(Object estado) {		
      // busca as cidades de um estado em uma persistencia qualquer
     List<Cidade> listaCidades = BancoDados.buscarCidadesPorEstado( estado );
    // montando o combo
   comboCidade = new SelectItem[listaCidades.size()];
	for (int i = 0; i < listaCidades.size(); i++) {
			Cidade c = listaCidades.get(i);
			comboCidade[i] = new SelectItem( c , c.getNmCidade() );
	}
}

public void carregaEstados() {
       List<SelectItem> listaUf = new ArrayList<SelectItem>();
			listaUf.add(new SelectItem("SC"));	
			listaUf.add(new SelectItem("PR"));
			listaUf.add(new SelectItem("RS"));	
        comboEstado = listaUf.toArray(new SelectItem[listaUf.size()]);
}

Talvez isso lhe ajude.
[]'s[/quote]

a.zanona, valeu irmão a ajuda!!! Desculpa não ter respondido logo, mas eu estava testando o material do serjaum, que infelizmente, acabou não funcionando…
Vc teria como me conseguir um modelo completo disso ou um exemplo usando o valuechangeevent?? Agradeço man.

Feliz ano novo pra todos!!!

eae pessoal, alguem pode me ajudar??

Agradeço!