Do banco de dados para sair em JComboBox

Gente, estou com um problema que não se resolve, já rodei a Internet inteira e nada de conseguir uma dica. Mas a coisa é fácil, com certeza.

Eu uso um banco de dados Access, que tem uma tabela chamada Produtos, e só tem 4 campos(codigo, nome, quantidade , custo).

No meu aplicativo tem uma JComboBox (CB1), onde eu quero mostrar os valores só do campo “nome”. Por exemplo , se lá no meu banco de dados, no campo nome já existem

fogão
geladeira
televisor
batedeira

eu desejo que esses dados apareçam na lista da JComboBox (CB1). É só isso o que eu preciso, mais nada.

Por que é que eu não posso fazer logo isso fixo? Tipo assim:

String [] itens = {“fogão”, “geladeira”,“televisor”,“batedeira”};
JComboBox CB1 = new JComboBox(itens);

Não posso fazer isto, porque essa lista de itens vai aumentar a cada hora, a cada dia que entrar um novo produto na loja e for incorporado ao banco de dados.

O que eu preciso é apenas de um código que mostre na JComboBox todos os produtos que estão no banco de dados, que mostre o nome deles. Só isso. Deve ser duas ou três linhas de código.

Gente, isso não pode ser difícil, se alguém souber , dá uma ajuda aí.
Luca

Digamos que vc tenha um botão em seu form que retorne um ArrayList com os dados do banco. Use o iterator deste ArrayList para inserir os dados no comboBox:

[code]
comboBox.removeAllItems(); //remove os itens atuais do comboBox.
ArrayList produtos = produtoDAO.findAll(); //‘produtoDAO’ é meu objeto que retorna os produtos do banco.
Iterator i = produtos.iterator();

while(i.hasNext()) {
comboBox.addItem(String.valueOf(i.next()));
}
[/code]Se for um array de Strings vindo da consulta do banco, faça um laço pra ir adicionando os valores no comboBox.

1 curtida

Bem, simplificando…

[code]
// primeiro vc limpar seu combo box
CB1.removeAlltItems();

// agora vc adiciona os itens novos a partir do result set…
// (claro q vc já usou um select para pegar os nomes né???)
while ( resultSet.next() ) {
CB1.addItem( resultSet.getString( 1 ) ); // onde 1 é o número da coluna que os dados do nome foram pegos no select
}

CB1.updateUI(); // atualiza a visualizacao do combo, só para garantir :D[/code]
Falow!

1 curtida

Ao Antonioni e David,

Vocês resolveram uma maratona que eu estou há dias, mas ninguém respondia a minha questão, eu fiquei pensando que deveria ser fácil, mas porque não haviam respostas? Agora vocês ajudaram demais. Ainda não coloquei em prática mas vou fazer daqui a pouco.

Mas essa parte do SELECT eu não entendi direito. Sei que é o comando em SQL que vai selecionar os dados do campo nome, mas parece que tem algo mais aí. Dá para esclarecer, David? Eu agradeceria muito.

Luca

[quote=Luca Mollini]Ao Antonioni e David,

Vocês resolveram uma maratona que eu estou há dias, mas ninguém respondia a minha questão, eu fiquei pensando que deveria ser fácil, mas porque não haviam respostas? Agora vocês ajudaram demais. Ainda não coloquei em prática mas vou fazer daqui a pouco.

Mas essa parte do SELECT eu não entendi direito. Sei que é o comando em SQL que vai selecionar os dados do campo nome, mas parece que tem algo mais aí. Dá para esclarecer, David? Eu agradeceria muito.

Luca[/quote]

Como assim? Tipo, vc quer saber qual vai ser a instrução SQL?

Oi, Manux, obrigado pela ajuda também.

A instrução SELECT eu sei fazer, mas estou um pouco confuso entre o código do Antonioni e o do David, se puder esclarecer, parecem que fazem a mesma coisa por dois caminhos diferentes, ou não? Dá uma clareada aí no código, amigo, agradeço muito…

Abraço,
Luca

Para o código do David

// primeiro vc limpar seu combo box
 CB1.removeAlltItems();
 
 // agora vc adiciona os itens novos a partir do result set... 
 // (claro q vc já usou um select para pegar os nomes né???)
 while ( resultSet.next() ) {
     CB1.addItem( resultSet.getString( 1 ) ); // onde 1 é o número da coluna que os dados do nome foram pegos no select
 }
 
 CB1.updateUI(); // atualiza a visualizacao do combo, só para garantir 

Vc utilizará essa lógica se querer preencher o seu combo diretamente a partir do resultado da consulta…que é o objeto ResultSet. Então, dessa forma vc pode ser o seguinte metodo na sua classe:

public void preencheCombo(ResultSet resultSet){
// primeiro vc limpar seu combo box
 CB1.removeAlltItems(); 
while ( resultSet.next() ) {
     CB1.addItem( resultSet.getString( 1 ) ); 
}
} 
 CB1.updateUI(); // atualiza a visualizacao do combo, só para garantir 

E o resultSet vem de uma código parecido com este:

Statement stmt = suaConexao.createStatement();
ResultSet resultSet = stmt.executeQuery("select nome from produtos");

Já o do Antônio:

 comboBox.removeAllItems(); //remove os itens atuais do comboBox.
 ArrayList produtos = produtoDAO.findAll(); //'produtoDAO' é meu objeto que retorna os produtos do banco.
 Iterator i = produtos.iterator();
 
 while(i.hasNext()) {
   comboBox.addItem(String.valueOf(i.next()));
 }

Vc tem no produtoDAO.findAll() uma busca com o resultSet, mas ao invés de vc retorná-lo, vc preeche um ArrayList com os dados do resultSet e retorna o ArrayList. Observe que produtoDAO é uma instância da classe que possui o método findAll():

public ArrayList findAll(){
Statement stmt = suaConexao.createStatement();
ResultSet resultSet = stmt.executeQuery("select nome from produtos");
ArrayList list=new ArrayList();
while ( resultSet.next() ) {
     list.add(resuSet.getString( 1 )); 
}
return list;
}

Espero poder ter ajudado.

Olá, Camila,

Quero agradecer sua colaboração, você esclareceu mais ainda as ajudas do Antonioni e do David, muito obrigado, Camila.

Mas está dando um erro, assim:

illegal start of expression
public ArrayList foundAll()

Veja a parte do meu código que faz a conexão, e declara a JComboBox:

String url = "jdbc:odbc:Comercio";  
          try 
             {
                 Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
                 Connection MinhaConexao = DriverManager.getConnection(url); 
                 MeuState = MinhaConexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
     	            ResultSet.CONCUR_READ_ONLY);
                 rs = MeuState.executeQuery("SELECT * FROM Produtos"); 
                 rs.first();
                 atualizaCampos();
                    
             }
          catch(ClassNotFoundException ex)
            {
                 System.out.println("Driver JDBC-ODBC não encontrado!");
            }

          catch(SQLException ex)
           {
                 System.out.println("Problemas na conexao com a fonte de dados");
           } 

          // abaixo a lista da JComboBox

           public ArrayList findAll()
             {
                Statement stmt = MinhaConexao.createStatement();
                ResultSet rs2 = stmt.executeQuery("SELECT Nome FROM Produtos");
                ArrayList lista=new ArrayList();
                while (rs2.next()) 
                 {
                    list.add(rs2.getString(2)); 
                 }
                    return lista;
             }

            JComboBox CB1 = new JComboBox(lista);

        // a partir daqui o código continua 

Se alguém souber o que estou fazendo de errado e puder me avisar, agradeço.

Tentei fazer assim, Camila, como você falou , mas não sei se era isso, se puder complementar te agradeço.

Abraço,
Luca

E ai Luca,

Cara dá uma olhada nesta parte do código:

 list.add(rs2.getString(2)); 

Acho que vc queria colocar

[b]
lista.add(rs.getString(2));
[/b]

Não é? Deve ser por isso que está dando erro…
Espero ter ajudado…
Abraços

Olá, Manux, tudo bem contigo?

Realmente havia esse erro que você aponta:

list.add(rs2.getString(2));

mas apenas no list , era lista, o outro não, eu estava trabalhando com duas RecordSet, uma rs e uma rs2. mas ainda não é isso o que está gerando o erro, eu consertei essas coisas, mas o erro continua. Mas meu avô dizia, “só vale a pena viver se é para lutar!” Então, tô quebrando a cara nesse troço.

Valeu, Manux, muito obrigado, mais uma vez!

Abraço,
Luca

Opa,

Hum…

Faz assim me manda o seu código pra ver o que eu posso fazer…
Pode ser?

Abraços

Olá, Manux, ontem que tive que ficar fora de casa, só acessei seu último post agora nesse momento, desculpe ter demorado a responder.

A questão não é um código específico meu. Vamos imaginar um aplicativo para estudo, que só tenha uma JComboBox, mais nada, você clica na setinha dela e vê a lista de nomes de produtos. Só isso resolve meu problema.

Então, para ficar mais claro ainda, a única coisa que eu preciso é uma parte de código que faça uma JComboBox mostrar os valores de um campo chamado produtos. É só isso.

Mas esses nomes não podem estar em um vetor pré-determinado, tipo assim:

String [] lista = {“fogão”, “geladeira”, “ventilador” “batedeira”};
JComboBox CB1 = new JComboBox(lista);

Isso aí acima não serve, porque essa lista deve ser os registros do campo produtos, lá do banco de dados. Se entrar um produto novo, tem que aparecer na JComboBox.

Então, se alguém fizer um código que só tenha uma JComboBox, que abre na lista dela os dados de um campo produtos do banco de dados, resolve para mim. Não precisa mais nada.

a tabela do banco de dados se chama Produtos;
a Conecction se chama MinhaConexao;
o Statement se chama MeuState;
a ResultSet se chama rs;
o campo do banco de dados se chama produtos;
e a JComboBox que se chama CB1.

Se alguém souber fazer uma classe que só tenha uma JComboBox, nem label, nem textfield, nem button, nada, e essa JComboBox abra a lista dos produtos, vai me ajudar muito, e eu agradeço demais.

Abraço a todos,
Luca

[code]
try {
// muda o nome da tabela para TbProdutos, pode dar pau po ter o mesmo
// nome do campo
rs = MeuState.executeQuery( “SELECT produtos from TbProdutos” );

CB1.removeAllItems();

while ( rs.next() ) {

    CB1.addItem( rs.getString( 1 ) );

}

CB1.updateUI();

} catch ( SQLException exc ) {

System.out.println( "Erro no SQL:\n" + exc );

}[/code]
Espero que funcione!

Falow!

O meu codigo também contem um bug, consigo herdad os nomes da base de dados, mais só depois de selecionar um daquele Items que já vem pre-definidos pelo NetBeans (Item 1, Item 2, …) e caso eu os excluir na Propriedade/Model do jcombobox, não herda. Mais detalhes no vídeo abaixo:

[youtube]http://www.youtube.com/watch?v=Czc1Nuyspow[/youtube]

Segue abaixo os codigos:

Formulario:

[code]public void PreecherCombo(){
Fornecedor fornecedor = new Fornecedor();
ResultSet rs;

    rs = fornecedor.NomeFornecedor(null);
    
    String nomeFornecedorCad;
    
    try{
        cmbFornecedores.removeAllItems();
      
        while(rs.next()){
            nomeFornecedorCad = rs.getString("nomefornecedor");
            cmbFornecedores.addItem(nomeFornecedorCad); 
            cmbFornecedores.updateUI();
        }
        
        
    }
    catch(Exception ex){
        JOptionPane.showMessageDialog(null, ex);
    }
}[/code]

Na Classe:

[code]public ResultSet NomeFornecedor(String nome){

     conn.Conectar();
     ResultSet rs = null;
     
     try{
        rs = conn.Consultar("SELECT * FROM fornecedores");
    }
    catch(Exception ex){
        JOptionPane.showMessageDialog(null, ex);
    }
    
    
    conn.Desconectar();
     
     return rs;
 }[/code]

Se alguem puder me dar um help, desde já agradeço!

Boa Noite!!!

amigo pra corrigir isso é simples, coloca o código pra pegar os dados no combobox dentro do seu construtor, assim ele já vai pegar os dados logo ao inicializar a tela, inclusive o problema de não conseguir selecionar o item do combobox tambem vai sumir, abraço.

pessoal estava passando por este post, e notei q estou com o mesmo problema q o nosso caro amigo Luca Mollini…
ou seja tenho uma tabela no banco de dados estados onde contem o id, o nome do estado e a abreviação do nome do esta(uf).

estou tentando fazer um select no banco e adicionar todos os nomes do estados cadastrados em um array ou vetor ou um objeto do tipo estado, mais nenhuma tive sucesso, naão sei se é algo q estou fazendo, se alguém tiver a solução para o problema que estou tendo

Atualmente estou tentando fazer dessa maneira mais nao esta funcionando, se alguém tiver uma solução agradeço desde já

-----------------CLASSE ESTADOS------------------

public class Estado {
int id;
String uf,nome;

public Estado() {
	
}
public Estado(int id, String uf,String nome) {
	this.id = id;
	this.nome = nome;
	this.uf = uf;
}
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getUf() {
	return uf;
}
public void setUf(String uf) {
	this.uf = uf;
}
public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}

}

-----------------DOA ESTADOS ONDE ESTA O SELECT PARA RETORNAR OS ESTADOS CADASTRADOS-----------------

public class DaoCidadeEstado {

//Select estado
	public ArrayList selectEstado () throws SQLException{
			
		String sql = "select nome from tb_estados";
		Connection con = Conexao.getConnection();
		PreparedStatement stmt = con.prepareStatement(sql);
		ResultSet Rs = stmt.executeQuery();
		
		ArrayList listAll = new ArrayList();   
		
		while(Rs.next()) {  
	        listAll.add(Rs.getString(2));  
		}
        
		
		stmt.close();
		con.close();
		return listAll; 
	
	}

}

---------------COMBOBOX ONDE TENHO QUE RETORNAR TODOS OS ESTADOS-------------

final JComboBox comboBox_RecebeEstado = new JComboBox();
comboBox_RecebeEstado.setFont(new Font(“Tahoma”, Font.PLAIN, 12));
comboBox_RecebeEstado.removeAllItems();
comboBox_RecebeEstado.addItem("");
try {
DaoCidadeEstado objEstado = new DaoCidadeEstado();
ArrayList lista = objEstado.selectEstado();
comboBox_RecebeEstado.setModel(new DefaultComboBoxModel(lista.toArray()));
} catch (Exception e) {
JOptionPane.showMessageDialog(null, “ERRO estado”);
}