Atualização de itens no combobox

2 respostas
marcos3

Pessoal, estou desenvolvendo um pequenos sistema (coisa simples) para atender a seguinte especificação: controlar materiais utilizados no mês numa prestação de serviços. Detalhe é que durante o mês são cadastrados novos clientes sempre, a listagem de materiais deve ser constantemente atualizada para atender as necessidades desses novos clientes.

Já modelei o banco. Pra resumir a dúvida em questão, estou trabalhando com 03 tabelas (materiais, clientes, mat_utilizados).

Estou implementando a interface utilizando o netbeans versão 7.3. É necessário que na tela onde será feito a inclusão dos materiais já seja possível acessar a tela de cadastro pra inserir materiais e clientes sempre que necessário.

Utilizei o seguinte código para preencher os combobox:
private void AtualizaListaMateriais(){
         String listaMaterial = "select nom_material from material order by nom_material";
         
          cmbx_material.removeAllItems();//limpar combobox antes de preencher pra evitar duplicidades
          
         con2.ExecutaSql(listaMaterial);        
         
         //preenchendo lista de materiais
            try{
                while(con2.rs.next()){
                    cmbx_material.addItem(con2.rs.getString("nom_material"));
                }                 
            }catch(SQLException e){
                JOptionPane.showMessageDialog(null,"Erro ao carregar a lista de materiais \n"+ e.getMessage());
            }catch(NullPointerException e){}
     }
E no evento "mousepressed" do combo chamo o código acima:
private void cmbx_materialMousePressed(java.awt.event.MouseEvent evt) {                                           
        AtualizaListaMateriais();
    }

Com isso consigo preencher o combobox, e sempre que incluo novo cliente ou material, basta clicar no combobox que a lista é atualizada.

Tenho um campo de texto ao lado do combobox que exibe o código do material selecionado, dessa forma:
private void CarregaIdMaterial(){
         if(codMaterial == false){
             try{
                 String sql = "select * from material where nom_material like '"+cmbx_material.getSelectedItem()+"'";
                 con2.ExecutaSql(sql);
                 con2.rs.next();
                 tf_id_material.setText(con2.rs.getString("idmaterial"));
             }catch(SQLException e){
                 JOptionPane.showMessageDialog(null,"Erro ao carregar a lista  \n"+ e.getMessage());
             }
         }
         codMaterial = false; 
     }

O código acima é acionado no evento acitonperformed do combobox.
Então sempre que seleciono determinado nome na lista, o código correspondente aparece no campo de texto ao lado.

O problema é que ao inserir um novo material, esse código que serve para exibir o código do item selecionado pára de funcionar.

Alguém pode me ajudar a resolver?

2 Respostas

marcos3

Pessoal, não sei se é a melhor opção, mas a princípio criei uma thread pra monitorar o combobox, o código ficou assim:

public class SincronizadorMateriais implements Runnable{ @Override public void run() { try{ String sql = "select * from material where nom_material like '"+cmbx_material.getSelectedItem()+"'"; con3.ExecutaSql(sql); con3.rs.next(); tf_id_material.setText(con3.rs.getString("idmaterial")); }catch(SQLException e){ JOptionPane.showMessageDialog(null,"Erro ao carregar a lista \n"+ e.getMessage()); } } }

E faço a inicialização assim:

private void cmbx_materialActionPerformed(java.awt.event.ActionEvent evt) { (new Thread(new SincronizadorMateriais())).start(); }

marcos3

Um professor da faculdade me disse que este código que postei acima está correto, pelo menos do ponto de vista que resolve o problema de atualização do combobox, porém disse que tive um custo muito alto… e que há uma solução bem mais fácil de ser implementada, só que orientou que eu pesquisasse como isso poderia ser feito.

Acontece que não vejo outra forma de fazer, alguém poderia me dar alguma dica de uma possível solução?

Criado 20 de outubro de 2013
Ultima resposta 23 de out. de 2013
Respostas 2
Participantes 1