Preenchimento em Cascata de JComboBox

Pessoal,

 Estou com um problema que não estou conseguindo resolver. Tenho vários JComboBox que fazem preenchimento em cascata, ao selecionar o um ítem da lista de um JComboBox ele preenche o de baixo.

Esses são os Eventos:

private void cbEstadoActionPerformed(java.awt.event.ActionEvent evt) {
preencheComboCidade();
}

private void cbCidadeActionPerformed(java.awt.event.ActionEvent evt) {
    preencheComboBairro();
}

E essas são as ações:

public void preencheComboEstado(){
cbEstado.removeAllItems();
CidadeDao cidadeDao = new CidadeDao();
List lista = cidadeDao.todasCidades();

    for(Cidade cidade : lista){
        cbEstado.addItem(cidade.getEstado());                  
    }
   
}

public void preencheComboCidade(){
    cbCidade.removeAllItems();
    CidadeDao cidadeDao = new CidadeDao();
    List <Cidade> lista = cidadeDao.cidadesPorEstado((String)cbEstado.getSelectedItem());
    
    for(Cidade cidade : lista){
         cbCidade.addItem(cidade);
         
    }
           
}

public void preencheComboBairro(){
    cbBairro.removeAllItems();
    BairroDao bairroDao = new BairroDao();
    Cidade cidade = (Cidade)cbCidade.getSelectedItem();
    JOptionPane.showMessageDialog(null, "" + cidade.getId());
    List <Bairro> lista = bairroDao.listarBairroPorCidade(cidade.getId());
    
    for (Bairro bairro : lista){
        cbBairro.addItem(bairro);
    }
    
    
}

 Só que quando seleciono um ítem no "cbEstado", ele preenche o cbCidade e ao preencher ele chama o evento ActionPerfomed desse combo, mas não é isso que eu queria, eu queria que só chamasse o ActionPerfomed desse como quando eu selecionasse um ítem. Alguém tem alguma idéia?

Obrigado.

Fera, ao invés de usar o ActionPerformed() use o ItemStateChanged() e verifique se o combo está ou não com o foco, tipo assim:

private void cbEstadoItemStateChanged(java.awt.event.ItemEvent evt) { if (cbEstado.isFocusOwner()) { // se o cbEstado estiver com o foco, executa... preencheComboCidade(); } } private void cbCidadeItemStateChanged(java.awt.event.ItemEvent evt) { if (cbCidade.isFocusOwner()) { // se o cbCidade estiver com o foco, executa... preencheComboBairro(); } }Tenta aí e me diz se funcionou…

Olá
Eu não sei… esse listener funciona, mas tive alguns probleminhas com ele.
Consegui solucionar utilizando esse listener, que me pareceu mais estavél

       class Main implements PopupMenuListener {
       .//..
       
       JComboBox box = new JComboBox(itens);
	box.addPopupMenuListener(this);
	box.setFocusable(true);

       //....
	public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
	//....
	}

Espero ter ajudado
Flwsss

Linkel,

Muito obrigado pela ajuda, fiz do jeito que você indicou o funcionou corretamente. Obrigado.

É isso aí, brother! Que bom que conseguiu… Parabéns!

Cara a minha duvida é muito parecida e está me deixando meio perdido.

Eu tenho 5 comboBox em cascata
Ordem >> Familia >> Genero >> Especie tb tenho a comboBox numeração que preenche todas outras.

O problema é:
estou fazendo

 private void NumeracaoItemStateChanged(java.awt.event.ItemEvent evt) {                                                          
     if (Numeracao.getSelectedItem()=="") {  
         //reinicia todas as comboBox
     }
     else{
     // limpa as comboBox
     // insere só os itens nas comboBox relacionados com o item selecionado (esses itens são orginados de consultas sql)
     }  
 } 
 private void OrdemItemStateChanged(java.awt.event.ItemEvent evt) {                                                          
     if (Ordem.getSelectedItem()=="") {  
         //reinicia Família
     }
     else{
     // limpa Familia
     // insere só os itens na Familia relacionados com o item selecionado (esses itens são orginados de consultas sql)
     }  
 } 
 private void FamiliaItemStateChanged(java.awt.event.ItemEvent evt) {                                                          
     if (Familia.getSelectedItem()=="") {  
         //reinicia Ordem e Genero
     }
     else{
     // limpa Ordem e Genero
     // insere só os itens na Ordem e Genero relacionados com o item selecionado (esses itens são orginados de consultas sql)
     }  
 } 

Só que está dando uns paus meio loucos queria saber se tem outro jeito mais organizado de fazer isso

Amigão, não sei se entendi corretamente quais seriam esses “paus” que têm dado aí, mas acho que sei o porque… Todos os seus JComboBoxes estão executando o evento itemStateChanged e realizando as alterações simultaneamente sem critério, já que não possuem o foco. Não sei exatamente as suas regras para cascateamento desses combos mas tente verificar se o combo possui ou não o foco antes de concluir o evento itemStateChanged, assim:

[code]private void NumeracaoItemStateChanged(java.awt.event.ItemEvent evt) {
if (!Numeracao.isFocusOwner()) return; // se o combo Numeracao não estiver com o foco nada vai acontecer…

if (Numeracao.getSelectedItem()=="") {    
    //reinicia todas as comboBox  
}  
else{  
// limpa as comboBox  
// insere só os itens nas comboBox relacionados com o item selecionado (esses itens são orginados de consultas sql)  
}    

}[/code]Isso é para o caso de o cascateamento ser definido combo por combo, se não resolver o seu problema então é bom que você poste aqui o código exato do que está fazendo e que descreva melhor as regras para o preenchimento desses combos…
Tente o que eu disse com todos os combos e me diga no que deu…

Um abraço!

Opa, obrigado pela resposta vou tentar usar focus. Depois que eu aprender como é que usa.

As regras são:
A ordem das comboBox é Ordem >> Familia >> Genero >> Especie >> Numeração
Quando selecionado um item a comboBox altera as comboBox’s superiores e a seguinte inferior a ela de acordo com o Banco de Dados;
Exemplo se alguem se alguem seleciona um genero da comboBox generol ela limpa a comboBox familia e preenche o nome da familia do genero selecionado e tambem preenche a comboBox Ordem com o nome da ordem do respectivo genero e lista na comboBox Especie a lista de especies relativas àquele genero.
Se alguém selecionar um campo em branco na comboBox ela reinicia todas as comboBox’s.
A unica comboBox que não serve de ponto de partida é a comboBox Especie que depende da ComboBox Genero.

Se tu achas que usar o focus é melhor por favor me diga como usá-lo.

Pois é, brother… Eu já disse como verificar o foco… É assim:

if (!Numeracao.isFocusOwner()) return; // se o combo Numeracao não estiver com o foco nada vai acontecer...Note que tem uma exclamação - “!” - no inicio do nome do combo Numeracao - isso significa negação - então, se o combo não estiver com o foco (isFocusOwner()) o evento itemStateChanged se cancela.
Tenta aí e me diz…

Eu inseri essa chamada de método ai mas daí quando eu clico no comboBox Numeracao ela num faz mais nada. E agora?

… Então você esqueceu o “!” antes do nome do combo… Para você entender melhor, faça assim:

if (Numeracao.isFocusOwner() == false) return;Para maior confiança de que estará fazendo certo copie o trecho aqui e cole no seu projeto… Lembrando que para cada combo você deverá fazer o mesmo porém mudando o combo que será verificado quanto ao foco…
E agora, vai dar certo ou não vai!?

[quote=Linkel]… Então você esqueceu o “!” antes do nome do combo… Para você entender melhor, faça assim:

if (Numeracao.isFocusOwner() == false) return;Para maior confiança de que estará fazendo certo copie o trecho aqui e cole no seu projeto… Lembrando que para cada combo você deverá fazer o mesmo porém mudando o combo que será verificado quanto ao foco…
E agora, vai dar certo ou não vai!?[/quote]

Olá amigo eu sei que ! serve como negação. E não me esqueci de usar-lá, e seu novo código tb não funcionou. Quando eu clicko na comboBox e escolho um item nada acontece mais. Eu só inseri o seu código antes do código que fazia as coisas.

Olhai o meu código dessa comboBox em questão
:smiley:

[code]private void numeracaoBox1ItemStateChanged(java.awt.event.ItemEvent evt) {
ResultSet nb1;
if(numeracaoBox1.isFocusOwner()== false){ return;}
if (numeracaoBox1.getSelectedItem()==""){

//Removendo todos os itens das comboBox usadas
    generoBox2.removeAllItems();
    generoBox2.addItem("");
    //especieBox2.removeAllItems();
    //especieBox2.addItem("");
    classeBox2.removeAllItems();
    classeBox2.addItem("");
    familiaBox2.removeAllItems();
    familiaBox2.addItem("");
    ordemBox2.removeAllItems();
    ordemBox2.addItem("");
    filoBox2.removeAllItems();
    filoBox2.addItem("");
//Limpando os textFields usados
    catalogadorField2.setText("") ;
    caracteristicasArea2.setText("");
    nomevulgarField2.setText("") ;
    dataField2.setText("") ;
    localField2.setText("") ;
    latitudeField2.setText("") ;
    longitudeField2.setText("") ;
    detalhesField2.setText("") ;
    localizacaoField2.setText("") ;
    
 //Reiniciando as comboBox
    nb1 = busca.buscaGenero();
    try{
        while(nb1.next()){            
        generoBox2.addItem(nb1.getString("nome"));
        
        }
    }catch(SQLException e) {
            System.err.println("SQL Exception... Erro na consulta:");
            e.printStackTrace();
}
    nb1 = busca.buscaGeneroClasse();
    try{
        while(nb1.next()){            
        classeBox2.addItem(nb1.getString("classe"));
        }
    }catch(SQLException e) {
            System.err.println("SQL Exception... Erro na consulta:");
            e.printStackTrace();
}
    nb1 = busca.buscaGeneroOrdem();
    try{
        while(nb1.next()){            
        ordemBox2.addItem(nb1.getString("ordem"));
        }
    }catch(SQLException e) {
            System.err.println("SQL Exception... Erro na consulta:");
            e.printStackTrace();
}
    nb1 = busca.buscaGeneroFamilia();
    try{
        while(nb1.next()){            
        familiaBox2.addItem(nb1.getString("familia"));
        }
    }catch(SQLException e) {
            System.err.println("SQL Exception... Erro na consulta:");
            e.printStackTrace();
}

}
else{
nb1 = busca.buscaExemplar(“numeracao = “+ numeracaoBox1.getSelectedItem()+””);

    try{
       if(nb1.next()){
           generoBox2.removeAllItems();
           generoBox2.addItem(nb1.getString("genero"));
          
           catalogadorField2.setText(nb1.getString("coletor")) ;
           caracteristicasArea2.setText(nb1.getString("caracteristicas"));
           nomevulgarField2.setText(nb1.getString("nomeVulgar")) ;
           dataField2.setText(nb1.getString("dataColeta")) ;
           localField2.setText(nb1.getString("localColeta")) ;
           detalhesField2.setText(nb1.getString("detalhes")) ;
           localizacaoField2.setText(nb1.getString("localizacao")) ;
           latitudeField2.setText(nb1.getString("lat")) ;
           longitudeField2.setText(nb1.getString("lon")) ;
       }
       
    }
    catch(SQLException e) {
            System.err.println("SQL Exception... Erro na consulta: numeracaoBox1");
            e.printStackTrace();
}
    nb1 = busca.buscaGenero("nome = '"+ generoBox2.getSelectedItem() +"'");
    try{
        if(nb1.next()){            
        classeBox2.removeAllItems();
        familiaBox2.removeAllItems();
        ordemBox2.removeAllItems();
        filoBox2.removeAllItems();
        classeBox2.addItem(nb1.getString("classe"));
        familiaBox2.addItem(nb1.getString("familia"));
        ordemBox2.addItem(nb1.getString("ordem"));
        filoBox2.addItem(nb1.getString("filo"));
        }
    }
    catch(SQLException e) {
            System.err.println("SQL Exception... Erro na consulta:");
            e.printStackTrace();
}

}

} [/code]

[quote=germanosk]Olá amigo eu sei que ! serve como negação. E não me esqueci de usar-lá, e seu novo código tb não funcionou. Quando eu clicko na comboBox e escolho um item nada acontece mais. Eu só inseri o seu código antes do código que fazia as coisas.[/quote]Fera, devo considerar isso como um ato humilde de quem está pedidindo ajuda num fórum ou como um ato orgulhoso de quem não aceita algumas respostas?
Desculpe-me se eu disse que você não sabe para quê serve o “!” e se meu código não te ajudou em nada… Só estava tentando te ajudar…
Eu te disse que esse código dependeria do quê exatamente está fazendo e da forma de cascateamento de seus jCombos… Se o cascateamento é feito com base na alteração exclusivamente iteragida pelo usuário então é isso aí mesmo. Se o restante do método não estiver sendo executado, logicamente, é porque o combo não está com o foco. Dessa forma, em cada combo você deverá implementar o cascateamento de todos os demais combos, ou implementar em cada combo as ações que ele tomará se estiver com o foco e as que tomará se não estiver com o foco (é o melhor a fazer). Isso é, se a alteração dos demais importar ao cascateamento…
Realmente fica muito difícil dizer exatamente o que você deverá fazer, visto que é um problema peculiar ao seu projeto e só você sabe realmente o que precisa e as regras… Além do mais, se for esperar todas as repostas exatamente como deverão ser feitas, sem nenhum problema para você pensar e resolver, é melhor postar seu projeto aqui pra galera desenvolver ele pra você…
Não se exite! Estamos aí humildemente para ajudar a quem precise conforme os conhecimentos de cada um…
Um abraço!

[quote=Linkel][quote=germanosk]Olá amigo eu sei que ! serve como negação. E não me esqueci de usar-lá, e seu novo código tb não funcionou. Quando eu clicko na comboBox e escolho um item nada acontece mais. Eu só inseri o seu código antes do código que fazia as coisas.[/quote]Fera, devo considerar isso como um ato humilde de quem está pedidindo ajuda num fórum ou como um ato orgulhoso de quem não aceita algumas respostas?
Desculpe-me se eu disse que você não sabe para quê serve o “!” e se meu código não te ajudou em nada… Só estava tentando te ajudar…
Eu te disse que esse código dependeria do quê exatamente está fazendo e da forma de cascateamento de seus jCombos… Se o cascateamento é feito com base na alteração exclusivamente iteragida pelo usuário então é isso aí mesmo. Se o restante do método não estiver sendo executado, logicamente, é porque o combo não está com o foco. Dessa forma, em cada combo você deverá implementar o cascateamento de todos os demais combos, ou implementar em cada combo as ações que ele tomará se estiver com o foco e as que tomará se não estiver com o foco (é o melhor a fazer). Isso é, se a alteração dos demais importar ao cascateamento…
Realmente fica muito difícil dizer exatamente o que você deverá fazer, visto que é um problema peculiar ao seu projeto e só você sabe realmente o que precisa e as regras… Além do mais, se for esperar todas as repostas exatamente como deverão ser feitas, sem nenhum problema para você pensar e resolver, é melhor postar seu projeto aqui pra galera desenvolver ele pra você…
Não se exite! Estamos aí humildemente para ajudar a quem precise conforme os conhecimentos de cada um…
Um abraço![/quote]

Olá eu num quero parecer arrongante nem nada do genêro. Mas me parece que os usuários de foruns de Java não gostam muito de ajudar, pois geralmente as respostas são vai ler o tutorial ou vai pesquisar no google. Eu vim aqui na boa falar um problema que eu não estou conseguindo resolver ( Eu num lembro de ter pedido para resolverem todos os problemas ) e quero avisar que só postei aqui pq eu li muito e mesmo assim não consegui resolver isso.

E com relação ao focus continuo sem entender como ele funciona pois vc sugeriu que eu inseri um aquela chamada caso ele não tivesse focus porem apos inserir tal comando a unica coisa que aconteceu é que não utilizo mais akela box. ou seja ela só paraou de funcionar.
Gostaria que dissesse como faz para ela adquirir focus. pois clickando num acontece mais.

[quote=germanosk]Olá eu num quero parecer arrongante nem nada do genêro. Mas me parece que os usuários de foruns de Java não gostam muito de ajudar, pois geralmente as respostas são vai ler o tutorial ou vai pesquisar no google. Eu vim aqui na boa falar um problema que eu não estou conseguindo resolver ( Eu num lembro de ter pedido para resolverem todos os problemas ) e quero avisar que só postei aqui pq eu li muito e mesmo assim não consegui resolver isso.
E com relação ao focus continuo sem entender como ele funciona pois vc sugeriu que eu inseri um aquela chamada caso ele não tivesse focus porem apos inserir tal comando a unica coisa que aconteceu é que não utilizo mais akela box. ou seja ela só paraou de funcionar.
Gostaria que dissesse como faz para ela adquirir focus. pois clickando num acontece mais.[/quote]
Brother, com certeza eu não disse para você ir ler tutoriais ou pesquisar em site algum, pelo contrário, eu dei minha opinião sobre o seu problema com o intuito de ajudá-lo. Achei que foi arrogante sim, mas não me importo. No início é assim mesmo; tem muita gente sem educação que acha que sabe demais nesses fóruns e por isso eles dão respostas do nível das que você bem citou. Mas como pode ver, existem também os que tentam ajudar de alguma forma. E os iniciantes tendem a achar que fóruns são para resolverem seus problemas cabalmente, daí as contradições… Mas, deixando isso pra lá, vamos ao que interessa…
(…) Já que, mesmo clicando sobre o combo e selecionando um dos itens, ele não executa o método implementado, então o combo pode não estar habilitado a receber o foco. Já verificou isso? Garanta que o combo pode receber o foco na criação do objeto, assim:

jCombo.setFocusable(true); jCombo.setRequestFocusEnabled(true);Se estiver usando uma IDE tipo Netbeans, tem propriedades equivalentes a esses métodos que basta você manter habilitadas para ser garantido que o componente poderá receber o foco.
Faça isso para todos os combos…
O comando “return” cancela a execução do método…
Não tem como você postar a classe inteira aqui não? Mas poste como arquivo, através de upload, senão o escript de formatação fica muito grande e eu sempre tenho problemas para visualizar o fórum quando existem muito código formatado numa mesma página, rsrs…
Teste a atribuição de foco e me diga o que deu…

[quote=Linkel]Brother, com certeza eu não disse para você ir ler tutoriais ou pesquisar em site algum, pelo contrário, eu dei minha opinião sobre o seu problema com o intuito de ajudá-lo. Achei que foi arrogante sim, mas não me importo. No início é assim mesmo; tem muita gente sem educação que acha que sabe demais nesses fóruns e por isso eles dão respostas do nível das que você bem citou. Mas como pode ver, existem também os que tentam ajudar de alguma forma. E os iniciantes tendem a achar que fóruns são para resolverem seus problemas cabalmente, daí as contradições… Mas, deixando isso pra lá, vamos ao que interessa…
(…) Já que, mesmo clicando sobre o combo e selecionando um dos itens, ele não executa o método implementado, então o combo pode não estar habilitado a receber o foco. Já verificou isso? Garanta que o combo pode receber o foco na criação do objeto, assim:

jCombo.setFocusable(true); jCombo.setRequestFocusEnabled(true);Se estiver usando uma IDE tipo Netbeans, tem propriedades equivalentes a esses métodos que basta você manter habilitadas para ser garantido que o componente poderá receber o foco.
Faça isso para todos os combos…
O comando “return” cancela a execução do método…
Não tem como você postar a classe inteira aqui não? Mas poste como arquivo, através de upload, senão o escript de formatação fica muito grande e eu sempre tenho problemas para visualizar o fórum quando existem muito código formatado numa mesma página, rsrs…
Teste a atribuição de foco e me diga o que deu…[/quote]

Cara desisti de fazer desse jeito aí, mudei regra, mudei algoritmo, mudei um tanto de coisa num está do jeito que eu quero mas pelo menos está funcionando :? .

Hehehe… Pelo menos está funcionando, né…
É isso aí… Precisando estamos aí!!!
Um abraço!

Olá Amigos!

bom desculpem em refazer está pergunta, pois pelas datas já faz um tempinho que foram respondidas neste típico, mas se ainda tiver algume ai que possa me ajudar ficarei muito grato.

O problema é o seguinte, tenho umas tabelas no banco de dados Mysql e com seus devidos relacionamentos, e estou com dificuldade em implementar o seguinte:

tenho 3 jCombobox uma pegando os departamentos, outra pegando as Divisões e outra pegando as Seções, gostaria de filtrar nas jCombobox o codigo de cada tabela, tipo ao selecionar um departamento na jcombobox departamento ele me preenchesse a jcombobox Divisão (codigo) relacionado com o departamento selecionado e ao escolher a Divisão me preenchesse a jcombobox seções funcionando como um filtro para facilitar e redizir a lista de cada combo não trazendo uma lista enorme.

Sou iniciante no java e estou utilizando o netbeans .

Alguem ai poderia me dar uma ajuda?

agradeço e fico no aguardo.

Olá amigos!

Bom estou ainda tentando implementar minhas jcombobox em cascata e até agora continuo com duvidas e dificuldades.

Mas consegui fazer o preenchimento da minha jcombobox através de uma query e gostaria de uma ajuda se possivel.

Essa é a query que passei:

 private void jComboBox2ItemStateChanged(java.awt.event.ItemEvent evt) {
              if (jComboBox2.isFocusOwner()) {
              itemMaterialMobiliarioQuery = entityManager.createNamedQuery("ItemMaterialMobiliario.findByCodItemMaterialMobiliario");
              itemMaterialMobiliarioQuery.setParameter("codItemMaterialMobiliario",jComboBox2.getSelectedIndex());

              List<ItemMaterialMobiliario> data = itemMaterialMobiliarioQuery.getResultList();
              jComboBox2.setSelectedItem(data.get(0).getDescricaoItemMaterialMobiliario());
             
          }

consegui selecionar o item e mostrar na jtaBle minha pergunta é como passar outra query para preencher autra jcombobox vinculando o código desta jcombobox2.

na jcombobox2 tenho os itens referentes ao material tipo cadeira ao selecionar a cadeira ele me preenche na outra Jcombobox3 que seria codmaterialmobiliario mostrando na lista só os items relacionados a cadeira.

Alguma sujestão ai dos amigos

Fico no aguardo dos mais experientes, pois sou inciante ainda no java.