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();
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!
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.
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).
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).
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.
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 ?