Dúvida no ComboBox Dinâmico

10 respostas
Kleber-rr

Olá pessoal, como vão?

É o seguinte: gostaria de saber como eu posso fazer um combobox dinâmico. A situação é muito semelhante ao caso do Estado/CIdade: Uma combo escolhe o estado, e a próxima já traria uma lista das cidades daquele estado.

No meu caso, eu tenho uma combo para programa e outro para serviços, onde um programa tem varios serviços (como eu disse, muito semelhante ao caso do Estado/Cidade).

Abaixo segue meu código da jsp para quem puder me ajudar....

<h:outputText value="Programa: " />
			<h:selectOneMenu binding="#{unidadeHandler.programaSelecionado}">
				<f:selectItem itemValue="2" itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.programaParaComboBox}" />
			</h:selectOneMenu>
		
		
		<h:outputText value="Serviço: " />
			<h:selectOneMenu binding="#{unidadeHandler.servicoSelecionado}">
			<f:selectItem itemValue="3" itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.servicoParaComboBox}" />
			</h:selectOneMenu>

Agradeço muito pessoal, a quem puder me ajudar!!

Feliz Natal e Próspero Ano Novo a todos!!!

10 Respostas

JonathanSSantos

Agora coloca um valueChangeListener… e coloca teu metodo no teu managedBean que recebe um event!

Dai faz tua logica e troca o combo box embaixo conforme tua logica!

:smiley: :smiley:

facinhoo facinhooo!

Kleber-rr

JonathanSSantos:
Agora coloca um valueChangeListener… e coloca teu metodo no teu managedBean que recebe um event!

Dai faz tua logica e troca o combo box embaixo conforme tua logica!

:smiley: :smiley:

facinhoo facinhooo!

Poxa JonathanSSantos, valeu por ter respondido. Eu até vi alguma coisa sobre o valuechangelistener, mas sou iniciante em java, e estou com dúvida em como fazer essa lógica.

Você por acaso tem algum código de exemplo nesse sentido pra mim ter uma base??

Agradeço man.

JonathanSSantos

Kleber-rr:
Poxa JonathanSSantos, valeu por ter respondido. Eu até vi alguma coisa sobre o valuechangelistener, mas sou iniciante em java, e estou com dúvida em como fazer essa lógica.

Você por acaso tem algum código de exemplo nesse sentido pra mim ter uma base??

Agradeço man.

Manow… da uma lida sobre valueChangeListener!!

tu vai criar um metodo tipo esse:

public void changeComboBoxTwo(Event e){
     String valueSelected = e.getNewValue().toString();
     //tua logica pra preencher o combobox
     listComboBoxTwo = DAO.listForComboBoxOne(valueSelected);
     FacesContext.get...().renderResponse();
     //Aqui eu me esqueci qual o get do FacesContext pra fazer o renderResponse.. 
     //mais tu pega a instancia do facesContext e dps que tu pega tu coloca 
     //o renderResponse!! mais ou menos isso
}

e’ mais ou menos isso… nao me lembro mto bem!
mas tem que ter o renderResponse la antes de atualizar a pagina pra atualizar o valor dakela lista…

sendo que a listComboBoxTwo e’ linkada no teu comboBoxTwo!!
ve se tu entendeu…

qlqer coisa da um tok!

Kleber-rr

Mano, no lugar de:

public void changeComboBoxTwo(Event e){

Não deveria ser?

public void changeComboBoxTwo(ValueChangeListener e){

Quanto à lógica, eu vou quebrar a cabeça aqui… rsrsrsrs
Sei que não é dificil, só não sei ainda como fazer!!! huahaaua

Valeu man!! Abs.

JonathanSSantos

Kleber-rr:
Mano, no lugar de:

public void changeComboBoxTwo(Event e){

Não deveria ser?

public void changeComboBoxTwo(ValueChangeListener e){

Quanto à lógica, eu vou quebrar a cabeça aqui… rsrsrsrs
Sei que não é dificil, só não sei ainda como fazer!!! huahaaua

Valeu man!! Abs.

Nao me lembro qual que e’…
mais e’ event… e nao e’ valueChangeListener…

e quanto a logica ela ja ta feita no codigo la emcima…
tu soh vai ter que pegar por um metodo do teu dao… os valores da comboboxtwo pelo teu valor da comboboxone

Eh soh um metodo no banco que faca isso!!

Entendeu?!

Kleber-rr
JonathanSSantos:
Kleber-rr:
Mano, no lugar de:
public void changeComboBoxTwo(Event e){
Não deveria ser?
public void changeComboBoxTwo(ValueChangeListener e){

Quanto à lógica, eu vou quebrar a cabeça aqui.... rsrsrsrs
Sei que não é dificil, só não sei ainda como fazer!!! huahaaua

Valeu man!! Abs.

Nao me lembro qual que e'...
mais e' event.. e nao e' valueChangeListener...

e quanto a logica ela ja ta feita no codigo la emcima...
tu soh vai ter que pegar por um metodo do teu dao.. os valores da comboboxtwo pelo teu valor da comboboxone

Eh soh um metodo no banco que faca isso!!

Entendeu?!

Esse é uma outra dificuldade que eu tenho... eu tenho q criar um método no meu Dao para cada opção que eu quero?? por exemplo, eu tenho q criar uma criteria se eu quiser uma lista das cidades do estado SP, outra para a lista das cidades do RJ, e assim por diante??

Mano, vou abusar um pouco da tua boa vontade, e vou colocar os codigos do meu dao e do meu bean pra ver se facilita a sua ajuda.... Desculpa incomodar...

public class UnidadeDao extends Dao<Unidade> {

	private Logger logger = Logger.getLogger(UnidadeDao.class);

	public UnidadeDao(Session session, Class<?> classe) {
		super(session, Unidade.class);
	}

	public Unidade pesquisaUnidadeById(Long cod_unidadeexecutora) {
		logger.info("pesquisaUnidadeById : " + cod_unidadeexecutora);
		return (Unidade) session.load(Unidade.class, cod_unidadeexecutora);
	}

	public Unidade pesquisaUnidadeByNome(String nome) {
		logger.info("pesquisaUnidadeByNome : " + nome);
		Criteria c = session.createCriteria(Unidade.class);
		c.add(Restrictions.ilike("nome", nome + "%"));
		c.addOrder(Order.asc("nome"));

		return (Unidade) c.uniqueResult();
	}

	public List<String> findByNameSuggest(String busca) {
		logger.info("findByNameSuggest : " + busca);
		Criteria c = session.createCriteria(Unidade.class);
		c.add(Restrictions.ilike("nome", busca + "%"));
		c.addOrder(Order.asc("nome"));
		c.setProjection(Projections.property("nome"));

		return c.list();
	}

	@SuppressWarnings("unchecked")
	public List<Unidade> pesquisaUnidades(String nome) {
		Criteria c = session.createCriteria(Unidade.class);
		c.add(Restrictions.ilike("nome", "%" + nome + "%"));

		return c.list();
	}

	@SuppressWarnings("unchecked")
	public List<Unidade> pesquisaServicosByPSB2(String nome) {
		return this.session.createCriteria(Servico.class).createCriteria("PSB")
				.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE))
				.addOrder(Order.asc("PSB")).list();
	}

	@SuppressWarnings("unchecked")
	public List<Unidade> pesquisaServicosByPSB(String nome) {
		if (nome == null || nome.equalsIgnoreCase("PSB"))
			return (List<Unidade>) this.session.createCriteria(Unidade.class)
					.list();
		return (List<Unidade>) this.session.createCriteria(Servico.class).add(
				Restrictions.ilike("nome", "%" + nome + "%")).list();
	}

}
public class UnidadeHandler {

	private Unidade unidade = new Unidade();
	private Long id;

	// INICIO DOS MÉTODOS HTMLSELECT
	// ===============================================

	// select para usuarioGestor
	private HtmlSelectOneMenu usuarioSelecionado;

	public HtmlSelectOneMenu getusuarioSelecionado() {
		return usuarioSelecionado;
	}

	public void setusuarioSelecionado(HtmlSelectOneMenu usuarioSelecionado) {
		this.usuarioSelecionado = usuarioSelecionado;
	}

	// select para programa
	private HtmlSelectOneMenu programaSelecionado;

	public HtmlSelectOneMenu getprogramaSelecionado() {
		return programaSelecionado;
	}

	public void setprogramaSelecionado(HtmlSelectOneMenu programaSelecionado) {
		this.programaSelecionado = programaSelecionado;
	}

	// select para servico - MUDAR MÉTODO PARA MANY
	private HtmlSelectOneMenu servicoSelecionado;

	public HtmlSelectOneMenu getservicoSelecionado() {
		return servicoSelecionado;
	}

	public void setservicoSelecionado(HtmlSelectOneMenu servicoSelecionado) {
		this.servicoSelecionado = servicoSelecionado;
	}

	// select para modalidade - MUDAR MÉTODO PARA MANY
	private HtmlSelectOneMenu modalidadeSelecionado;

	public HtmlSelectOneMenu getmodalidadeSelecionado() {
		return modalidadeSelecionado;
	}

	public void setmodalidadeSelecionado(HtmlSelectOneMenu modalidadeSelecionado) {
		this.modalidadeSelecionado = modalidadeSelecionado;
	}

	// select para internet
	private HtmlSelectOneMenu internetSelecionado;

	public HtmlSelectOneMenu getinternetSelecionado() {
		return internetSelecionado;
	}

	public void setinternetSelecionado(HtmlSelectOneMenu internetSelecionado) {
		this.internetSelecionado = internetSelecionado;
	}

	// select para orgaogestor
	private HtmlSelectOneMenu orgaogestorSelecionado;

	public HtmlSelectOneMenu getorgaogestorSelecionado() {
		return orgaogestorSelecionado;
	}

	public void setorgaogestorSelecionado(
			HtmlSelectOneMenu orgaogestorSelecionado) {
		this.orgaogestorSelecionado = orgaogestorSelecionado;
	}

	// select para municipiosrr
	private HtmlSelectOneMenu municipiosrrSelecionado;

	public HtmlSelectOneMenu getmunicipiosrrSelecionado() {
		return municipiosrrSelecionado;
	}

	public void setmunicipiosrrSelecionado(
			HtmlSelectOneMenu municipiosrrSelecionado) {
		this.municipiosrrSelecionado = municipiosrrSelecionado;
	}

	// FIM DOS MÉTODOS SELECT ===============================================

	// Fazer os getters e os setters da variavel
	public Unidade getUnidade() {
		return unidade;
	}

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

	// lista de orgaos gestores

	public List<Unidade> getUnidadesExecutoras() {
		System.out.println("Carregando a lista de unidades executoras ...");
		Session session = HibernateUtil.currentSession();
		Dao<Unidade> ueDao = new Dao<Unidade>(session, Unidade.class);
		return ueDao.list();
	}

	// INICIO DOS METODOS SELECT PEGA E DAS LISTAS==============

	// select para ModalidadeHandler
	private ModalidadeHandler pegaModalidadeHandler() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ELContext elContext = facesContext.getELContext();
		ELResolver resolver = facesContext.getApplication().getELResolver();
		Object m = resolver.getValue(elContext, null, "modalidadeHandler");

		return (ModalidadeHandler) m;
	}

	public List<SelectItem> getModalidadeParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		// usaremos o id como valor e o nome como label para os SelectItem.
		ModalidadeHandler handler = pegaModalidadeHandler();
		for (ModalidadeInstitucional m : handler.getModalidades()) {
			lista.add(new SelectItem(m.getCod_modalidade(), m.getNome()));
		}
		return lista;
	}

	// select para UsuarioHandler
	private UsuarioHandler pegaUsuarioHandler() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ELContext elContext = facesContext.getELContext();
		ELResolver resolver = facesContext.getApplication().getELResolver();
		Object u = resolver.getValue(elContext, null, "usuarioHandler");

		return (UsuarioHandler) u;
	}

	public List<SelectItem> getUsuarioParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		// usaremos o id como valor e o nome como label para os SelectItem.
		UsuarioHandler handler = pegaUsuarioHandler();
		for (Usuario u : handler.getUsuarios()) {
			lista.add(new SelectItem(u.getCod_usuario(), u.getNome()));
		}
		return lista;
	}

	// select para programaHandler
	private ProgramaHandler pegaProgramaHandler() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ELContext elContext = facesContext.getELContext();
		ELResolver resolver = facesContext.getApplication().getELResolver();
		Object p = resolver.getValue(elContext, null, "programaHandler");

		return (ProgramaHandler) p;
	}

	public List<SelectItem> getProgramaParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		// usaremos o id como valor e o nome como label para os SelectItem.
		ProgramaHandler handler = pegaProgramaHandler();
		for (Programa p : handler.getProgramas()) {
			lista.add(new SelectItem(p.getCod_programa(), p.getNome()));
		}
		return lista;
	}

	// select para servicoHandler
	private ServicoHandler pegaServicoHandler() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ELContext elContext = facesContext.getELContext();
		ELResolver resolver = facesContext.getApplication().getELResolver();
		Object s = resolver.getValue(elContext, null, "servicoHandler");

		return (ServicoHandler) s;
	}

	public List<SelectItem> getServicoParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		// usaremos o id como valor e o nome como label para os SelectItem.
		ServicoHandler handler = pegaServicoHandler();
		for (Servico s : handler.getServicos()) {
			lista.add(new SelectItem(s.getCod_servico(), s.getNome()));
		}
		return lista;
	}

	// AQUI EU CRIO O MÉTODO ============================== JONATHAN, AJUDA AQUI!!!!!!!! RSRRSS

	public void alteraCampoPSB(ValueChangeListener event) {
		if (event.toString().contains("PSB")) {// EU TENHO Q FAZER UM IF PARA CADA VALOR DO COMBOBOX ANTERIOR??????

		}
	}

	// select para orgaogestorHandler
	private OrgaoGestorHandler pegaOrgaoGestorHandler() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ELContext elContext = facesContext.getELContext();
		ELResolver resolver = facesContext.getApplication().getELResolver();
		Object og = resolver.getValue(elContext, null, "orgaogestorHandler");

		return (OrgaoGestorHandler) og;
	}

	public List<SelectItem> getOrgaoGestorParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		// usaremos o id como valor e o nome como label para os SelectItem.
		OrgaoGestorHandler handler = pegaOrgaoGestorHandler();
		for (OrgaoGestor og : handler.getOrgaosGestores()) {
			lista.add(new SelectItem(og.getCod_orgaogestor(), og.getNome()));
		}
		return lista;
	}

	// select para municipiosrrHandler
	private MunicipiosRRHandler pegaMunicipiosRRHandler() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ELContext elContext = facesContext.getELContext();
		ELResolver resolver = facesContext.getApplication().getELResolver();
		Object m = resolver.getValue(elContext, null, "municipiosRRHandler");

		return (MunicipiosRRHandler) m;
	}

	public List<SelectItem> getMunicipiosRRParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		// usaremos o id como valor e o nome como label para os SelectItem.
		MunicipiosRRHandler handler = pegaMunicipiosRRHandler();
		for (MunicipiosRR m : handler.getListaMunicipiosRR()) {
			lista
					.add(new SelectItem(m.getCod_municipiosrr(), m
							.getMunicipios()));
		}
		return lista;
	}

	// select para internethandler
	private InternetHandler pegaInternetHandler() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ELContext elContext = facesContext.getELContext();
		ELResolver resolver = facesContext.getApplication().getELResolver();
		Object i = resolver.getValue(elContext, null, "internetHandler");

		return (InternetHandler) i;
	}

	public List<SelectItem> getInternetParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		// usaremos o id como valor e o nome como label para os SelectItem.
		InternetHandler handler = pegaInternetHandler();
		for (Internet i : handler.getListaInternet()) {
			lista.add(new SelectItem(i.getCod_internet(), i.getTipo()));
		}
		return lista;
	}


	public long foo(String x) throws NumberFormatException { 
		return (Long.parseLong(x));
}

	public void bar() throws NumberFormatException {
		try {
			long a = this.foo("x"); // Chama o método foo() que declara lançar
			System.out.println("String convertida em int é: " + a); // Este
		} catch (NumberFormatException e) { // Este catch captura a exceção.
			throw new NumberFormatException(); // Mas aqui dentro ele resolve

		}
	}

	public String salva() {
		System.out.println("Adicionando: " + unidade.getNome());
		Session session = HibernateUtil.currentSession();
		Dao<Unidade> ueDao = new Dao<Unidade>(session, Unidade.class);
		Dao<OrgaoGestor> ogDao = new Dao<OrgaoGestor>(session,
				OrgaoGestor.class);
		Dao<MunicipiosRR> municipiosrrDao = new Dao<MunicipiosRR>(session,
				MunicipiosRR.class);
		Dao<Internet> internetDao = new Dao<Internet>(session, Internet.class);
		Dao<Usuario> usuarioDao = new Dao<Usuario>(session, Usuario.class);
		Dao<ModalidadeInstitucional> modalidadeDao = new Dao<ModalidadeInstitucional>(
				session, ModalidadeInstitucional.class);

		// modalidade
		Long id_modalidade = Long.valueOf(modalidadeSelecionado.getValue()
				.toString());
		ModalidadeInstitucional mi = modalidadeDao.load(id_modalidade);
		unidade.setModalidadeinstitucional_cod_modalidade(id_modalidade);

		// usuario
		Long id_usuario = Long
				.valueOf(usuarioSelecionado.getValue().toString());
		Usuario u = usuarioDao.load(id_usuario);
		unidade.setUsuario_cod_usuario(id_usuario);

		// orgaogestor
		Long id_orgaogestor = Long.valueOf(orgaogestorSelecionado.getValue()
				.toString());
		OrgaoGestor og = ogDao.load(id_orgaogestor);
		unidade.setOrgaogestor_cod_orgaogestor(id_orgaogestor);
		// municipios
		Long id_municipios = Long.valueOf(municipiosrrSelecionado.getValue()
				.toString());
		MunicipiosRR m = municipiosrrDao.load(id_municipios);
		unidade.setMunicipiosrr_cod_municipiosrr(id_municipios);
		// internet
		Long id_internet = Long.valueOf(internetSelecionado.getValue()
				.toString());
		Internet i = internetDao.load(id_internet);
		unidade.setInternet_cod_internet(id_internet);

		ueDao.merge(this.unidade);

		this.unidade = new Unidade();
		return "sucesso";
	}

	public String excluir(ActionEvent event) {
		System.out.println("Excluindo: " + unidade.getCod_unidade());
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("excluir");
		Long id = (Long) param.getValue();

		Session session = HibernateUtil.currentSession();
		Dao<Unidade> ueDao = new Dao<Unidade>(session, Unidade.class);
		this.unidade = ueDao.load(id);
		ueDao.delete(this.unidade);
		this.unidade = new Unidade();
		return "excluido";

	}

	public String load() {
		Session session = HibernateUtil.currentSession();
		Dao<Unidade> unidadeDao = new Dao<Unidade>(session, Unidade.class);
		this.unidade = unidadeDao.load(this.id);
		return "pesquisaSucesso";
	}

	public List<Unidade> getListaUnidades() {
		Session session = HibernateUtil.currentSession();
		UnidadeDao unidadeDao = new UnidadeDao(session, Unidade.class);
		return unidadeDao.list();
	}

	public List<Unidade> getUnidadesByNome() {
		Session session = HibernateUtil.currentSession();
		UnidadeDao unidadeDao = new UnidadeDao(session, Unidade.class);
		List<Unidade> lista = unidadeDao.pesquisaUnidades(this.unidade
				.getNome());
		return lista;
	}

	public List<Unidade> getServicosByPSB() {
		Session session = HibernateUtil.currentSession();
		UnidadeDao unidadeDao = new UnidadeDao(session, Servico.class);
		List<Unidade> lista = unidadeDao.pesquisaServicosByPSB(this.unidade
				.getNome());
		return lista;
	}

	public void escolheUnidade(ActionEvent event) {
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("editCod");
		Long id = (Long) param.getValue();

		Session session = HibernateUtil.currentSession();
		Dao<Unidade> ueDao = new Dao<Unidade>(session, Unidade.class);
		this.unidade = ueDao.load(id);
	}

	public void validaCase(FacesContext fc, UIComponent component, Object value) {
		String valor = value.toString();
		if (!valor.matches("[A-Z].*")) {
			throw new ValidatorException(new FacesMessage(
					"Inicie o nome com letra maiúscula!"));
		}
	}

}
JonathanSSantos

nao meu!
tu vai fazer o seguinte:

digamos que eu esteje procurando um estado!
la no meu evento do valueChangeListener… no metodo eu vo pegar

event.getNewValue().toString();

Isso vai me dar o valor que ta no comboBox… se tiver por exemplo no estado… RS

eu vo pegar com esse metodo… e vo pegar e jogar pra uma string ou nem precisaria… mais vamo joga…

String estado = event.getNewValue().toString();

Dentro do estado vai estar RS;

Dai eu vou no meu metodo no banco que e’

listCidades = DAO.listCidadePorEstado(estado);

E dai no meu metodo dao eu vou ter um sql mais ou menos assim:

String sql = "select * from cidade c WHERE c.estatoNome = " + estado + " ORDER BY c.nome ASC"

digamos que eu vou pegar na minha tabela cidade so’ as cidades que na coluna estadoNome tem RS

e dai vo joga pra minha listCidades…

dai eu vou dar o comando:

FacesContext.getCurrentInstance().renderResponse()

para renderizer a resposta na tela!

OK!?

Kleber-rr

Blz man, olha só... acho q estou desencalhando aos poucos.... rsrsrs

public void trocaServicoPrograma(ValueChangeEvent event) {
		String programa = event.getNewValue().toString();
		listaServicos = UnidadeDao.pesquisaServicos(programa);
		FacesContext.getCurrentInstance().renderResponse();
}

Olha se meu dao está certo...

@SuppressWarnings("unchecked")
	public List<Servico> pesquisaServicos(String nome) {
		Criteria c = session.createCriteria(Servico.class);
		c.add(Restrictions.ilike("nome", "%" + nome + "%"));

		return c.list();
	}

Só que ainda está dando no trocaServicoPrograma... ele pede pra modificar o método pesquisaServicos para static, mas se eu confirmar, sai dando um problema atrás do outro....

Man, mais uma vez, vai desculpando ae o aluguel...
Valeu.

Kleber-rr

eae mano, o q tu acha?

Kleber-rr

Pessoal, problema resolvido.

Acabei reformulando os métodos que estava utilizando e fiz um negocio mais simples e prático.

Solução completa está aqui.

http://www.guj.com.br/posts/list/15/149468.java#812134

Valeu.

Criado 22 de dezembro de 2009
Ultima resposta 19 de jan. de 2010
Respostas 10
Participantes 2