JcomboBox Model + removeAllItens()

4 respostas
AlexandreSA

Boa tarde,

Pessoal tenho 2 comboBox (ESTADO / CIDADE). Seleciono o Estado e me mostra todas as cidades ativas (ate ai tudo funcionando blz), o problema e:

1 - Seleciono: Minas Gerais (Aparece todas as cidades de minas)
2 - Seleciono: São Paulo (Aparece todas as cidades de sp)
3 - Seleciono: Minas Gerais NOVAMENTE (Aparece todas as cidades de minas e sp).

Tentei resolver isso inserindo o combo.removeAllItems();

Ai no passo 3 (citado acima) o combobox cidade so retorna o primeiro registro encontrado no Banco (MYSQL). Segue meu codigo se alguém puder me ajudar fico grato :lol:

public PesBairros() {
        initComponents();
        criaJtable();
        jScrollPane1.setViewportView(tabela);
        preencheComboEstado(comUF);
        AutoCompletion.enable(comCidades);
        AutoCompletion.enable(comUF);
    }

private void preencheComboEstado(JComboBox combo) {
        String SQLEstado = "select `EST_COD`, `EST_UF`, `EST_DESCRICAO` from `T_ESTADO` "
                + "order by `EST_DESCRICAO` ASC";
        if (conn.executeSQL(SQLEstado)) {
            try {
                do {
                    est_codigo = conn.resultset.getInt("EST_COD");
                    est_uf = conn.resultset.getString("EST_UF");
                    est_descricao = conn.resultset.getString("EST_DESCRICAO");
                    combo.addItem(new Estados(est_codigo, est_descricao, est_uf));
                    combo.setSelectedIndex(-1);
                } while (conn.resultset.next());
                combo.addItemListener(new ItemListener() {

                    public void itemStateChanged(ItemEvent evt) {
                        if (evt.getStateChange() == ItemEvent.SELECTED) {
                            Estados estado = (Estados) comUF.getSelectedItem();
                            est_codigo = estado.getCodigo();
                            labCidade.setEnabled(true);
                            comCidades.setEnabled(true);
                            comCidades.removeAllItems();
                            preencheComboCidade(comCidades, est_codigo);
                        }
                    }
                });
            } catch (SQLException erroSQL) {
                JOptionPane.showMessageDialog(null, erroSQL);
            }
        }
    }

private void preencheComboCidade(JComboBox combo, int estado) {
        String SQLCidade = "select `CID_COD`, `CID_DESCRICAO`, `EST_COD` from `T_CIDADE` "
                + "where `EST_COD` = " + estado + " and `CID_ATIVO` = true "
                + "order by CID_DESCRICAO ASC";
        if (conn.executeSQL(SQLCidade)) {
            try {
                do {
                    cid_descricao = conn.resultset.getString("CID_DESCRICAO");
                    cid_codigo = conn.resultset.getInt("CID_COD");
                    combo.addItem(new Cidades(estado, cid_codigo, cid_descricao));
                    combo.setSelectedIndex(-1);
                } while (conn.resultset.next());
                combo.addItemListener(new ItemListener() {

                    public void itemStateChanged(ItemEvent evt) {
                        if (evt.getStateChange() == ItemEvent.SELECTED) {
                            Cidades cidade = (Cidades) comCidades.getSelectedItem();
                            cid_codigo = cidade.getCodigoCidade();
                            cid_descricao = cidade.getDescricao();
                            labBairro.setEnabled(true);
                            txtPesquisa.setEnabled(true);
                            butPesquisar.setEnabled(true);
                            pesquisar();
                        }
                    }
                });
            } catch (SQLException erroSQL) {
                JOptionPane.showMessageDialog(null, erroSQL);
            }
        }
    }

4 Respostas

Ev3rton

Olá,

Talvez se você separasse um pouco mais os serviços das suas classe conseguisse um código mais limpo e fácil de entender.

Ao invés de você manter os métodos preencheComboEstado(JComboBox combo) e preencheComboCidade(JComboBox combo, int estado), você os separasse assim:

1- Em uma outra classe você colocaria dois métodos:

- public Estado[] getEstados();

- public Cidade[] getCidades(Estado estado);

2- Na sua classe de tela, você colocaria

- private void configurarCombo(JComboBox estados);

- private void preencherEstados();

- private void preencherCidades(Estado estado);

A implementação destes métodos ficaria assim:

public Estado[] getEstados(): realiza uma consulta no banco de dados de retorna um array com todos os estados encontrados.

public Cidade[] getCidades(Estado estado): realiza uma consulta no banco de dados e retorna um array com todas as cidades do estado informado.

private void configurarCombo(JComboBox estados): chama o método preencherEstados() e adiciona um evento no combo estados (actionListener) para que quando a seleção for alterada, seja obtida a nova seleção e utilizada para chamar o método preencherCidades(Estado estado).

private void preencherEstados(): chama o método getEstados() assim obtendo um array de estados, utilizando esse array configura o combo com um novo model (comboEstados.setModel(new DefaultComboBoxModel(arrayEstados)))

private void preencherCidades(): chama o método getCidades(Estado estado), utilizando o estado passado no parâmetro e assim obtendo um array de cidades. Com esse array de cidades cria um novo model para esse combo (comboCidades.setModel(new DefaultComboBoxModel(arrayCidades))).

Espero ter ajudado.
[ ]'s

AlexandreSA

Isso realmente eu tenho que fazer, o código está uma bagunça, mas o que eu descobrir é que o evento: “removeAllItems()” afeta o “ItemListener”.
Eu comentei todo os eventos ItemListener e o removeAllItems() funciou blz.

Será que se eu dividir meu código em outras classes isso vai resolver?

Não tentei ainda pq tenho um prazo para terminar esse projeto e falta outras funções que ainda estou criando. Se alguém puder ajudar ficarei muito grato.

Ev3rton

Olá,

Eu acredito que o removeAllItems() de nada afeta o ItemListener(), visto que o primeiro age sobre os itens do combo, enquanto o segundo sobre o Combo.

Se você não quiser alterar muito seu código, pelo menos uma coisa deve ser feita: remover o addItemListener() de dentro do while.
Você precisa registrar apenas uma vez um ouvinte para um evento do combo.

Outra coisa que talvez seja interessante você fazer é alterar a forma como popula o combo. Ao invés de utilizar removeAllItems() e depois adicionar os itens conforme recebe os resultados da query. Você poderia armazenar os resultados da query em um array e então utiliza-los de uma só vez para preencher o combo com o método setModel.

AlexandreSA

Ev3rton:
Olá,

Eu acredito que o removeAllItems() de nada afeta o ItemListener(), visto que o primeiro age sobre os itens do combo, enquanto o segundo sobre o Combo.

Se você não quiser alterar muito seu código, pelo menos uma coisa deve ser feita: remover o addItemListener() de dentro do while.
Você precisa registrar apenas uma vez um ouvinte para um evento do combo.

Outra coisa que talvez seja interessante você fazer é alterar a forma como popula o combo. Ao invés de utilizar removeAllItems() e depois adicionar os itens conforme recebe os resultados da query. Você poderia armazenar os resultados da query em um array e então utiliza-los de uma só vez para preencher o combo com o método setModel.

Vou testar suas sugestões quando conseguir posto o resultado.

Obrigado.

Criado 11 de novembro de 2011
Ultima resposta 16 de nov. de 2011
Respostas 4
Participantes 2