Popular JComboBox com dados do banco !AJUDAAAAA[RESOLVIDO]

4 respostas
psyhclo

Ola, estou querendo popular um JComboBox com os dados vindos do banco. pra isso eu tenho um metodo na classe ServicoDAO chamado ConsultaNoBanco, q e responsavel po buscar no banco. E tenho um JFrame chamado Agenda onde tenho um JComboBox. Estou querendo popular esse JComboBox, como faco? Estou tentando com array list mas nao ta dando. Aqui o metodo ConsultaNoBanco:

public ArrayList ConsultaNoBanco() {
         servico = new ArrayList();
         //fornPojo = new forn();
         SingletonBd.connecta.conecta("bancoSalao");
         this.con = SingletonBd.connecta.getCon();
        try {
            PreparedStatement stmt = con.prepareStatement("select * from servico");
            ResultSet rs = stmt.executeQuery();
            while(rs.next()){
                servicoPojo = new ServicoPOJO();               
                servicoPojo.setNome_servico(rs.getString("NOME_SERVICO"));

                servico.add(servicoPojo);
            }          
        }
            catch (SQLException ex) {
           JOptionPane.showMessageDialog(null, "Erro em consulta no banco"+ex.getMessage(),"SQLException", JOptionPane.ERROR_MESSAGE);          
            }
         SingletonBd.connecta.CloseCon();
         return servico;
}

4 Respostas

javer

Vou perder um tempinho para de dar uma dica.

Primeiro, tenha em mente que você vai trabalhar com um modelo, então vamos a classe modelo do JComboBox:
import java.util.List;
import java.util.ArrayList;
import javax.swing.AbstractListModel;
import javax.swing.JComboBox;
import javax.swing.MutableComboBoxModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

public class ArrayListComboBoxModel extends AbstractListModel implements MutableComboBoxModel {

    private ArrayList<ListDataListener> listeners = new ArrayList<ListDataListener>();
    private Object selectedItem;
    private List list;
    int index;
    JComboBox comboBox;

    public ArrayListComboBoxModel(List list) {
        super();
        this.list = list == null ? new ArrayList() : new ArrayList(list);
    }

    public ArrayListComboBoxModel(List list, JComboBox comboBox) {
        super();
        this.list = list == null ? new ArrayList() : new ArrayList(list);
        this.comboBox = comboBox;
    }

    public void addElement(Object element) {
        list.add(element);
        fireChangeNotification();
    }

    @Override
    public void addListDataListener(ListDataListener l) {
        synchronized (listeners) {
            listeners.add(l);
        }
    }

    public void fireChangeNotification() {
        synchronized (listeners) {
            ListDataEvent e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, getSize());
            for (ListDataListener listener : listeners) {
                listener.contentsChanged(e);
            }
        }
    }

    @Override
    public void removeListDataListener(ListDataListener l) {
        synchronized (listeners) {
            listeners.remove(l);
        }
    }

    // ListModel
    public int getSize() {
        // Return the size of the ArrayList
        return list.size();
    }

    public ArrayList<Object> getAllItems() {
        return (ArrayList<Object>) this.list;
    }

    public Object getElementAt(int i) {
        // Return the element at the specified position
        return list.size() > 0 ? list.get(i) : null;
    }

    // ComboBoxModel
    public Object getSelectedItem() {
        return selectedItem;
    }

    public int getItemIndex(Object item) {
        index = list.indexOf(item);
        return index;
    }

    public void setSelectedItemLista(Object item) {
        this.selectedItem = item;
        index = list.indexOf(item);
        if (comboBox != null) {
            comboBox.setSelectedIndex(index);
            comboBox.repaint();
        }
        this.fireChangeNotification();
    }

    public void setSelectedItem(Object item) {
        this.selectedItem = item;
        index = list.indexOf(item);
        this.fireChangeNotification();
    }

    public int getSelectedIndex() {
        //int index = list.indexOf(this.getSelectedItem());
        return index;
    }

    public void insertElementAt(Object element, int index) {
        // Insert the element at the specified position
        list.add(index, element);
        // Added in middle, notify ListDataListener objects
        fireChangeNotification();
    }

    public void removeElement(Object element) {
        // Find out position
        index = list.indexOf(element);
        if (index != -1) {
            // Remove an element
            list.remove(element);
        // Removed from middle, notify ListDataListener objects
        }
        fireChangeNotification();
    }

    public void removeElementAt(int index) {
        if (getSize() >= index) {
            // Remove an element at the specified position
            list.remove(index);
        // Removed from index, notify ListDataListener objects
        }
        fireChangeNotification();
    }

    public void setElementAt(int index, Object object) {
        list.set(index, object);
        fireChangeNotification();
    }

    public int getSelectedIndex(Object object) {
        index = list.indexOf(object);
        return index;
    }

    // Para esse metodo funcionar eh necessario que no Object esteja implementado
    // os metodos: hashcode, equal e compareTo
    public int getIndexOf(Object object) {
        int idx = -1;
        if (this.list != null) {
            idx = list.indexOf(object);
        }
        return idx;
    }
}

Segundo, você vai precisar de uma lista (pode ser o ArrayList) para adicionar ao modelo, então no deu DAO você precisa retornar uma lista de objetos (javabeans), esses javabeans precisa estar criados corretamente (com os métodos: toString, equals, hashcode e compareTo) para que você possa manipular seu JComboBox sem problemas, lembrando que você vai sempre mexer no modelo e nunca diretamente no JComboBox.

Supondo que fosse uma lista de clientes, então o objeto Cliente seria mais ou menos assim:
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;

/**
 *
 * @author Francisco
 */
public class Cliente implements Serializable, Comparable<Cliente> {

    public Cliente() {
    }
    private int codigo = 0;
    public static final String PROP_CODIGO = "codigo";
    private String nome;
    public static final String PROP_NOME = "nome";
    private String telefone;
    public static final String PROP_TELEFONE = "telefone";

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        String oldTelefone = this.telefone;
        this.telefone = telefone;
        propertyChangeSupport.firePropertyChange(PROP_TELEFONE, oldTelefone, telefone);
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        String oldNome = this.nome;
        this.nome = nome;
        propertyChangeSupport.firePropertyChange(PROP_NOME, oldNome, nome);
    }

    public int getCodigo() {
        return codigo;
    }

    public void setCodigo(int codigo) {
        int oldCodigo = this.codigo;
        this.codigo = codigo;
        propertyChangeSupport.firePropertyChange(PROP_CODIGO, oldCodigo, codigo);
    }
    private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

    @Override
    public int hashCode() {
        return (int) (this.getCodigo() * 333);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Cliente other = (Cliente) obj;
        if (this.getCodigo() != other.getCodigo()) {
            return false;
        }
        return true;
    }

    public int compareTo(Cliente o) {
        if (this.hashCode() < o.hashCode()) {
            return -1;
        } else if (this.hashCode() == o.hashCode()) {
            return 0;
        } else if (this.hashCode() > o.hashCode()) {
            return 1;
        } else {
            return 1;
        }
    }

    @Override
    public String toString() {
        return this.getNome();
    }
}
Segue exemplo de uso:
// Supondo que no seu DAO (ou de outro lugar) a lista venha montada assim
List<Cliente> listaClientes = new ArrayList<Cliente>();

Cliente item1 = new Cliente();
item1.setCodigo(1);
item1.setNome("JOSÉ DA SILVA");
item1.setTelefone("[telefone removido]");
listaClientes.add(item1);

Cliente item2 = new Cliente();
item2.setCodigo(2);
item2.setNome("MARIA DA SILVA");
item2.setTelefone("[telefone removido]");
listaClientes.add(item2);

// Agora você adiciona ao modelo do seu JComboBox
ArrayListComboBoxModel modeloComboBoxClientes = new ArrayListComboBoxModel(listaClientes);
comboClientes.setModel(modeloComboBoxClientes);

// Para que seu combo inicia mostrando a primeira posicao
comboClientes.getModel().setSelectedItem(comboClientes.getModel().getElementAt(0));

// Para que em determinado momento voce precise selecionar um determinado item na lista (numa consulta por exemplo)
Cliente itemConsultado = new Cliente(); // aqui no exemplo na tem nada no objeto
comboClientes.setSelectedItem(itemConsultado);

// Para pegar o objeto selecionado no momento
Cliente clienteSelecionado = (Cliente) comboClientes.getSelectedItem();

// Para remover todos os itens do JComboBox basta passar uma lista vazia
modeloComboBoxClientes = new ArrayListComboBoxModel(new ArrayList<Cliente>());
comboClientes.setModel(modeloComboBoxClientes);
Espero que tenha entendido e que possa te ajudar, só lembrando que trabalhar como modelos é bem mais "elegante" (JComboBox, JTable, JList, etc...)
psyhclo

Cara ta meio estranho, meio complexo. Pq tipo assim, eu pensei em simplesmente usar um metodo no classe DAO q pega os dados do banco e depois la no JFrame eu passasse os dados pra esse ComboBox, nao pensei q tinha q usar modelo tudo mais. Lembrando q o ComboBox e arrasta e joga no Panel, eu vejo muitos q eles fazem manual.

psyhclo

Pessoal e o seguinte, tenho uma classe chamada FuncionarioDAO que tem um metodo chamado buscaFuncionario() que pega do banco. E tenho um formulario JFrame com um JComboBox chamado funcionarios que eu arrastei pro painel, e eu quero popular ele com os nomes que o metodo buscaFuncionario() pegou. o metodo e esse embaixo. Como eu faria pra la na classe JFrame pegar os dados que esse metodo esta pegando e preencher no JComboBox?

public ArrayList buscaFuncionario() {
         funcionario = new ArrayList();
         //funcionarioPojo = new funcionario();
         SingletonBd.connecta.conecta("bancoSalao");
         this.con = SingletonBd.connecta.getCon();
        try {
            PreparedStatement stmt = con.prepareStatement("select * from funcionario");
            ResultSet rs = stmt.executeQuery();
            while(rs.next()){
                funcionarioPojo = new FuncionarioPOJO();
                funcionarioPojo.setNome_funcionario(rs.getString("NOME_FUNCIONARIO"));                                            
                funcionario.add(funcionarioPojo);
            }
        }
            catch (SQLException ex) {
           JOptionPane.showMessageDialog(null, "Erro em consultar no banco"+ex.getMessage(),"SQLException", JOptionPane.ERROR_MESSAGE);
                
            }
         SingletonBd.connecta.CloseCon();
         return funcionario;
}
fagner_sk8
Tenho um formulario de clientes que possui isso

public void mostraUF() throws SQLException {

CidadeDAO dao = new CidadeDAO();

cidades = dao.getLista("%" + jTPesquisa.getText() + %);

for (Iterator iter = cidades.iterator(); iter.hasNext()<img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/w.pngink.png?v=9" title=":wink:" class="emoji" alt=":wink:"> {

cb_uf.addItem(iter.next());

}

}

e tenho uam classe CidadeDAO com este método:

public List<Cidade> getLista(String nome) throws SQLException {

String sql = select * from cidade where cid_nome like?;

PreparedStatement stmt = this.conexao.prepareStatement(sql);

stmt.setString(1, nome);
ResultSet rs = stmt.executeQuery();
    List&lt;Cidade&gt; minhaLista = new ArrayList&lt;Cidade&gt;();
    while (rs.next()) {
        Cidade cid = new Cidade();
        cid.setCodigo(Long.valueOf(rs.getString("cid_codigo")));
        cid.setNome(rs.getString("cid_nome"));
        cid.setUf(rs.getString("cid_uf"));
        minhaLista.add(cid);
    }
    rs.close();
    stmt.close();
    return minhaLista;
}

estou tentando manipular minha combobox com os dados do banco de dados o que estou fazendo de errado?

Criado 20 de novembro de 2009
Ultima resposta 19 de mai. de 2010
Respostas 4
Participantes 3