Duvida JComboBox

Boa tarde pessoal !

Estou com a seguinte situação:

Entre os atributos de um usuário existe um que é o seu perfil.

Na tela de cadastro de usuarios tenho um JComboBox mostra as opções que o usuario tem para um campo.
Essas opções são carregadas a partir de uma tabela do banco de dados e aparecem no combo no formato ID - Descrição, como segue:

1 - Admin
2 - Guest
3 - Super

Na tabela Usuario, eu só gravo o ID do Perfil

Alguém tem uma dica de como devo proceder no momento de gravar meus dados na tabela usuário para pegar somente o ID ?

Acho que estou me atrapalhando ao usar o JComboBox.
Tentei fazer:


cmbUs_pePerfil.addItem(listaPerfil);            

Onde lista perfil seria:


List <Perfil> listaPerfil = perfilModel.getListaPerfil();

Mas não tive sucesso…

Obrigado a todos.

[]s

Você tem de adicionar os elementos um de cada vez. Não dá para adicionar uma lista de elementos de uma vez.

Cara o método addItem do ComboBox só aceita Objeto como parâmetro, e você tá passando uma Coleção de Perfis.
Você até pode inserir vários elementos de uma vez, mas através do model do componente, onde seria:

O * é onde tem que ser passado um ComboBoxModel para que seja criado com vários elementos de uma vez!

thingol:

A tentativa de adicionar um List realmente não funcionou, então eu estou fazendo assim:

    private void carregaCmbPerfil() {
        PerfilModel perfilModel = new PerfilModel();
        List <Perfil> listaPerfil = perfilModel.getListaPerfil();
        for (int i = 0; i < listaPerfil.size(); i++){                        
            cmbUs_pePerfil.addItem(listaPerfil.get(i).getPepeID() + " - " + listaPerfil.get(i).getPepeDescricao());            
        }        
    }        

Funciona, o problema é que quando eu seleciono um perfil e peço para gravar o usuario, eu teria que conseguir pegar o ID e a Descrição do Perfil separadamente, no entanto, quando eu faço

cmbUs_pePerfil.getSelectedItem())

Ele me retona uma String do tipo:

1 - Admin.

Consegui explicar ?
Se puder me ajudar, fico muito grato.

[]s

Se você precisa usar uma JComboBox onde os elementos são objetos (dessa maneira você teria não somente a descrição como também o ID), não Strings puras, você pode fazer isso de duas maneiras:
a) Você pode adicionar o objeto Perfil mesmo, mas aí ele tem de implementar toString, e toString tem de mostrar o ID e a descrição, como você fez. Isso acho que amarra “demais” seu programa, e não recomendaria isso em condições normais.
b) Você pode criar uma classe que implementa javax.swing.ComboBoxModel e que está relacionada com seu objeto Perfil ( veja http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ComboBoxModel.html )
c) Ou o método “gambiarra rules” - pegue a string mesmo (“1 - Admin”), e para conseguir o ID, separe o número (isso deixo como exercício).

troque isso por:

    private void carregaCmbPerfil() {
        PerfilModel perfilModel = new PerfilModel();
        List <Perfil> listaPerfil = perfilModel.getListaPerfil();
        for (int i = 0; i < listaPerfil.size(); i++){                        
            cmbUs_pePerfil.addItem(listaPerfil.get(i));            
        }        
    }        

Sendo assim, vc terá varios objetos Perfil na sua combo.
Depois seria facil pegar o Id:

Perfil perfil = (Perfil) cmbUs_pePerfil.getSelectedItem();
Long id = perfil.getId();

Agora, se vc adicionar o objeto Perfil na sua combo, o Swing vai exibir A REPRESENTAÇÃO STRING desse objeto na combo. Se vc nao disser qual é essa representação, a combo vai exibir algo como “perfil@123dfd43”.

Entao vc vai na sua classe e fornece a representação String assim:


public class Perfil {

     ...
     
     public String toString() {

          return this.getId() + " - " + this.getDescricao();

     }


}

O que o FabioCSI implementou é a minha opção “a)”. Ela é muito boa quando você não precisa definir o “toString” para mais de uma coisa (só para alimentar o JComboBox).

Ola pessoal…

Realmente da maneira que vocês propuseram funcionou, mas continuo com problema para mostrar no combo a opção correta para um usuario…

Ou seja, eu carrego o combo com todos as opções de perfis, mas tenho que mostrar o correto para o usuário que estiver sendo mostrado.

Até então eu carregava o combo com:

        for (int i = 0; i < listaPerfil.size(); i++){                        
            cmbUs_pePerfil.addItem(listaPerfil.get(i).getPepeID() + " - " + listaPerfil.get(i).getPepeDescricao());
        }        

E para setar a opção correta usava:

    private void mostraDados(Usuario u) {
        txtus_usID.setText(String.valueOf(u.getUsusId()));
        txtus_usPassword.setText(u.getUsusPassword());
        txtus_usLogin.setText(u.getUsusLogin());
        txtus_usNome.setText(u.getUsusNome());
        cmbUs_pePerfil.setSelectedItem(u.getPerfil().getPepeID() + " - " + u.getPerfil().getPepeDescricao());
    }    

sendo que o parametro Usuario u é o objeto usuário que quero mostrar.

Pensei em varrer o combo até que o id fosse igual ao id do perfil do usuario que quero mostrar, mas não sei se seria a melhor opção…

Ficou assim:

 private void mostraDados(Usuario u) {
        txtus_usID.setText(String.valueOf(u.getUsusId()));
        txtus_usPassword.setText(u.getUsusPassword());
        txtus_usLogin.setText(u.getUsusLogin());
        txtus_usNome.setText(u.getUsusNome());
        
        Perfil tempPerfil;
        int i = 0;
        do {        
            cmbUs_pePerfil.setSelectedIndex(i);
            tempPerfil = (Perfil)cmbUs_pePerfil.getSelectedItem();            
            i++;
        } while (tempPerfil.getPepeID() != u.getPerfil().getPepeID());                                
    }    

[]s

Não… não é a melhor opção

toString e equals no mesmo tópico e fods, mas vamos la…

Supondo que vc tem a seguinte lista de objetos na combo:

1 - Brasil
2 - Argentina
3 - Uruguai

e vc tem um objeto a ser selecionado:

Pais pais = new Pais(1, “Brasil”);

Vc pode fazer: combo.setSelectedItem( pais );

que ele vai selecionar o Brasil. mas PRA ISSO: Vc tem que dizer, assim como vc disse que a representação String e TAL, qual será o criterio para que 2 objetos sejam SIGNIFICATIVAMENTE iguais. pra isso, vc vai sobrescrever o EQUALS da classe, assim:

public boolean equals(Object obj) {
		
	if (obj instanceof Pais) {
		Pais outroPais = (Pais) obj;
		return outroPais.getId() == this.getId();			
	}
		
	return false;
		
}

Você acabou de dizer ao Java que 2 Países sao SIGNIFICATIVAMENTE IGUAIS, se os seus ID’s forem iguais.

Fabiocsi:

Problema resolvido !
Valeu pela ajuda e principalmente pela paciência.

Agora uma ultima pergunta: considerando que essa regra no meu sistema realmente determina se um perfil é igual a outro e que eu não preciso do método toString para outra finalidade, você vê algo que desabone essa implementação ?

[]s