[RESOLVIDO] ArrayList em um ComboBox

Tenho um ArrayList em que o objeto possui 2 propriedades, que é código e descrição.
Queria passar a descrição para a combobox, mas que pudesse acessar a propriedade código para poder saber qual o elemento selecionado e gravar no banco de dados.

Como fazer isso, teria que implementar uma ComboBoxModel?
Alguém tem um exemplo?
Existe outra forma, mais “fácil”?

Método que retorna o Array:

public ArrayList<Object> CarregarPaises() {
        ArrayList<Object> array = new ArrayList();
        String sql = "SELECT * FROM paises";
        ResultSet result = con.query(sql);
        try {
            while (result.next()) {
                LocalidadesPais paises = new LocalidadesPais();
                paises.setCodPais(result.getInt("cod_pais"));
                paises.setDescPais(result.getString("des_pais"));
                array.add(paises);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ConfiguracoesDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "ERRO!\n\n" + ex.getMessage(), "Carregar País", JOptionPane.ERROR_MESSAGE);
        }
        return array;
    }

Alguém consegue me ajudar?

Basta que o toString() do seu objeto retorne o atributo que você quer exibir.
No resto, você terá o objeto inteiro dentro do JComboBox.

É melhor usar um ArrayList<Pais> no lugar de um ArrayList<Object>. E nada impede você criar a combobox como JComboBox<Pais> também.

Vini,

Este é o meu problema, implementar o combobox.

    private void LoadEstados(){
        ArrayList<Object> array = local.CarregarPaises();
        comboboxEstadosPais.addItem(array.toString());
    }

Se fizer assim não dá, porque o objeto tem duas propriedades: descrição e código.
Ele esta listando, mas preciso listar apenas a descrição. Ele esta listando o objeto em string.
Também não consigo acessar as propriedades do objeto a partir do array.

Como faço essa implementação?

Chame o addItem sem chamar toString(). Deixe que a Combobox chame o addItem internamente.

Assim o getSelectedItem vai retornar o objeto da sua classe, com todos os atributos que ele tem.

Vini,

O problema é que não aparece a descrição do Pais…
Fica assi:

Achei um jeito + ou -…

public HashMap<Integer, String> CarregarPaises() {
        HashMap<Integer, String> hash = new HashMap<>();
        String sql = "SELECT * FROM i3_paises";
        ResultSet result = con.query(sql);
        try {
            while (result.next()) {
                hash.put(result.getInt("cod_pais"), result.getString("des_pais"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ConfiguracoesDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "ERRO!\n\n" + ex.getMessage(), "EstCar - Carregar País", JOptionPane.ERROR_MESSAGE);
        }
        return hash;
    }
    private void LoadEstados(){
        HashMap<Integer, String> mapa = local.CarregarPaises();
        
        for (Integer CodPais  : mapa.keySet()) {
            comboboxEstadosPais.addItem(mapa.get(CodPais));
            System.out.println(mapa.keySet());
        }
    }

O println retornou a sequencia do banco.
Poderia agora pegar o index selecionado do combo box e buscar a key do banco pelo HashMap.
Depois gravo…
Que acha?

Você sobrescreveu o método toString da classe LocalidadesPais, como indiquei no primeiro post?

[code]public class LocalidadePais {

//Resto da classe aqui

@Override
public void toString() {
return getDescPais();
}
}[/code]

Outra coisa, esse método ficaria melhor assim:

public List&lt;LocalidadesPais&gt; CarregarPaises() { List&lt;LocalidadesPais&gt; array = new ArrayList&lt;LocalidadesPais&gt;(); ResultSet result = con.query("SELECT * FROM paises"); try { while (result.next()) { LocalidadesPais pais = new LocalidadesPais(); pais.setCodPais(result.getInt("cod_pais")); pais.setDescPais(result.getString("des_pais")); array.add(pais); } } catch (SQLException ex) { Logger.getLogger(ConfiguracoesDAO.class.getName()).log(Level.SEVERE, null, ex); JOptionPane.showMessageDialog(null, "ERRO!\n\n" + ex.getMessage(), "Carregar País", JOptionPane.ERROR_MESSAGE); } return array; }

NOSSAA! PERFEITO!

Cara sofri pacas para conseguir fazer isso com hash, havia dado certo. Mas do seu jeito muito melhor, nossa. Reduzi consideravelmente o código, e ficou muito mais legível.
Tinha visto em outros sites sobre como sobrescrever o método toString, mas não havia entendido muito bem, do jeito que falou ficou nítido e entendi, o que é o mais importante.

Ficou assim:

Classe LocalidadesPais

 @Override  
   public String toString() {  
      return getDescPais();  
   }

Classe LocalidadesDAO

   public List<LocalidadesPais> CarregarPaises() {  
        List<LocalidadesPais> array = new ArrayList<LocalidadesPais>();  
        ResultSet result = con.query("SELECT * FROM i3_paises");  
        try {  
            while (result.next()) {  
                LocalidadesPais pais = new LocalidadesPais();  
                pais.setCodPais(result.getInt("cod_pais"));  
                pais.setDescPais(result.getString("des_pais"));  
                array.add(pais);  
            }  
        } catch (SQLException ex) {  
            Logger.getLogger(ConfiguracoesDAO.class.getName()).log(Level.SEVERE, null, ex);  
            JOptionPane.showMessageDialog(null, "ERRO!\n\n" + ex.getMessage(), "Carregar País", JOptionPane.ERROR_MESSAGE);  
        }  
        return array;  
    }

Classe Localidades

    public List<LocalidadesPais> CarregarPaises(){
        return localDAO.CarregarPaises();
    }

Classe FrmCadLocaldiades

   public class FrmCadLocalidades extends javax.swing.JDialog {
...
   
 private void tabLocalidadesStateChanged(javax.swing.event.ChangeEvent evt) {                                            
       JTabbedPane tp = (JTabbedPane) evt.getSource();
        int index = tp.getSelectedIndex();
        switch (index) {
            case 1:
                LoadEstados();
                break;
            case 2:
                //LoadCidades();
                break;
            default:
                break;
        }
    }
...
    private void LoadEstados(){
        comboboxEstadosPais.removeAllItems();  //Editei o post porque corrigi aqui, toda vez que acessava a aba de estados ele fazia novos addItem, duplicando os paises.
        for (LocalidadesPais p : local.CarregarPaises()) {
            comboboxEstadosPais.addItem(p.toString());
        }
    }

Acho que era isso…

OBRIGADO MESMO!

Esse for continua errado:

for (LocalidadesPais p : local.CarregarPaises()) { comboboxEstadosPais.addItem(p.toString()); }

Você não deve chamar o toString():

for (LocalidadesPais p : local.CarregarPaises()) { comboboxEstadosPais.addItem(p); }

Ele será chamado automaticamente pela combo, para desenhar o objeto. Porém, a combo deve armazenar os objetos do tipo certo, e não Strings.