Erro ao popular combobox com dados do banco

Bom dia !
Estou tentando popular uma combobox com dados de uma tabela do meu banco, mas ao executar o que aparece é isso: Imagem
Já não sei mais o que fazer.
Tentei usando comboboxmodel:
DefaultComboBoxModel defaultComboBox = null; try { defaultComboBox = new DefaultComboBoxModel(categoriaDAO.listarCategoriaReceita().toArray()); } catch (Exception ex) { Logger.getLogger(Transacoes.class.getName()).log(Level.SEVERE, null, ex); } cbCategoria.setModel(defaultComboBox)
Tentei usando Iterator:
`private void comboReceitas() {

      cbCategoria.removeAllItems(); //remove os itens atuais do comboBox.
            ArrayList produtos = null;
    try {
        produtos = categoriaDAO.listarCategoriaReceita(); //'produtoDAO' é meu objeto que retorna os produtos do banco.
    } catch (Exception ex) {
        Logger.getLogger(Menu.class.getName()).log(Level.SEVERE, null, ex);
    }
    
    Iterator i = produtos.iterator();
    while(i.hasNext()) {
        cbCategoria.addItem(String.valueOf(i.next()));
    }`

DAO:

    ` public ArrayList<Categoria> listarCategoriaReceita() throws Exception {
            ConexaoBanco c = new ConexaoBanco();
            String sql = "SELECT * FROM Categoria";
            PreparedStatement ps = c.getConexao().prepareStatement(sql);
            ResultSet rs = ps.executeQuery();

            ArrayList listaCategoriaReceita= new ArrayList();
            while (rs.next()) {
                Categoria categoria= new Categoria();
                categoria.setDesc_categoria(rs.getString("Des_Categoria"));
                listaCategoriaReceita.add(categoria);
            }

            return listaCategoriaReceita;
        }`

Isso é pq ta sendo exibido o próprio objeto e não o nome dele.

Não sei como funciona o Swing, mas to vendo que você esta passando uma String para o método addItem do cbCategoria

Então vamos la, deixarei dois exemplos para você, utilizando uma classe chamada Cachorro, ai você tenta adaptar para o seu código para praticar :+1:

Solução 1:

Cachorro cachorro = new Cachorro();
cachorro.setNome("Doguinho");
System.out.println(cachorro);//Aqui printará algo assim: package.Cachorro@ae6514cd

Para exibir o nome do cachorro sem chamar o getNome, deve-se sobrescrever o método toString() da classe Object

public class Cachorro {
    ...
    public String toString() {
        return this.nome;
    }

}
Cachorro cachorro = new Cachorro();
cachorro.setNome("Doguinho");

/*
Aqui printará Doguinho, pois toda vez que eu passo o próprio objeto para ser exibido,
o java chama o método toString internamente 
e eu disse pro meu método toString exibir o nome
*/
System.out.println(cachorro);

Solução 2:
Antes de adicionar ao combobox, você deve fazer o casting do objeto do iterator ou definir o Iterator como sendo um Iterator da sua classe, pois por padrão o iterator.next() retorna Object

Ex (Iterator de cachorro):

Iterator<Cachorro> i = cachorros.iterator();
while(i.hasNext()) {
    cbCachorro.addItem(i.next().getNome());//i.next() agora retorna um objeto do tipo Cachorro por causa do <Cachorro> definiado ao lado de Iterator
}

Ex (Casting)

Iterator i = cachorros.iterator();
while(i.hasNext()) {
    Cachorro cachorro = (Cachorro) i.next(); //Convertendo de Object para Cachorro

    cbCachorro.addItem(cachorro.getNome());
}

O que ele está exibindo ai é o endereço de memória do objeto categoria. acredito que você precise sobrescrever o método toString da sua classe Categoria.

ou você altera o seguinte trecho:

Iterator i = produtos.iterator();
while(i.hasNext()) {
cbCategoria.addItem(String.valueOf(i.next()));
}
de modo que você adicione em cbCategoria o atributo Desc_categoria da sua classe Categoria.

Nem esquenta a cabeça adicionando itens em um DefaultComboBoxModel, cria o seu próprio ComboBoxModel:

class ComboBoxModelCategoria extends DefaultComboBoxModel<String> {

    private List<Categoria> categorias = new ArrayList<>();

    public void setCategorias(List<Categoria> categorias) {
        this.categorias = categorias;
        fireContentsChanged(this, 0, categorias.size());
    }

    @Override
    public int getSize() {
        return categorias.size();
    }

    @Override
    public String getElementAt(int index) {
        Categoria categoria = categorias.get(index);
        return categoria.getDesc_categoria();
    }
}

Inicializa seu JComboBox assim:

cbCategoria = new JComboBox(new ComboBoxModelCategoria());

E atualiza o conteúdo dele assim:

private void comboReceitas() {
    try {
        List<Categoria> categorias = categoriaDAO.listarCategoriaReceita();
        ComboBoxModelCategoria comboBoxModel = (ComboBoxModelCategoria) cbCategoria.getModel();
        comboBoxModel.setCategorias(categorias);
    } catch (Exception ex) {
        Logger.getLogger(Menu.class.getName()).log(Level.SEVERE, null, ex);
    }
}
1 curtida