Problema com jcomboBox

7 respostas
E

Tenho uma classe Cliente onde nela tenho um atributo nome, passo todos os clientes para uma lista
em seguida uso o método abaixo para passar o nome de todos os clientes para o comboBox,
na interface do programa quando eu abro o comboBox todos os nomes estão la até os nomes repetidos,
mais ai que está o problema :frowning: , quando seleciono um dos nomes repetidos eu sempre vou parar no que está
mais em cima na comboBox.

Como se resolve essa questão de nomes iguais na comboBox :?:

private List<Cliente> listaClientes = clienteDao.lista();

  //Metodo para preencher o comboBox
    public void preencherNomesComboBox() {
        for (int i = 0; i < listaClientes.size(); i++) {
            comboBoxCliente.addItem(listaClientes.get(i).getNome());
        }
    }

7 Respostas

ViniGodoy

Você tem duas soluções:

  1. Não cadastrar objetos repetidos (se são repetidos, como a Combobox vai diferenciar entre um e outro?)
  2. Cadastrar objetos da sua classe de negócio diretamente, ao invés de nomes. Assim, dois “João da Silva” serão Clientes diferentes, e não simplesmente Strings “João da Silva” com nomes iguais. Para que isso funcione, sobrescreva o método toString() da classe Cliente e ao preencher o ComboBox faça, dentro do for:
E

ViniGodoy

1.Pensei que o comboBox diferenciaria pois no modo visual aparace duas vezes o nome do cliente, ou seja um está por exemplo na posição 3
e o outra na 5 do comboBox, quando eu utilizasse o método getSelectedIndex() eu escolhia oque eu queria. :!:

  1. Se eu passar o objeto diretamente, como o comboBoxCliente saberá qual atributo do cliente mostrar em sua lista :?:

Desde já agradeço a atenção :wink:

ViniGodoy

Se vc passar o cliente diretamente, ele usará o toString() da classe Cliente. Então, basta implementar o toString() assim:

public class Cliente { public String toString() { return getNome(); } }

Uma coisa conveniente dessa abordagem é que o método getSelectedItem() passará a te retornar um cliente, não um nome. Então, você pode fazer, por exemplo, isso:

public void salvar() { Cliente cliente = (Cliente) combo.getSelectedItem(); if (cliente == null) return; ClienteDao.salvar(cliente); }

Note que como um cliente inteiro foi retornado, não houve necessidade de pesquisar o id do nome do cliente retornado, ou fazer qualquer coisa desse gênero. Você teria problemas ao pesquisa o id, se tivesse só o string do nome (de fato, muita gente acaba perguntando aqui no GUJ como deixar uma coluna “id” escondida no combo, logo depois de fazer o que vc está fazendo).

E

Coloquei o toString() na classe e funcionou corretamente. :slight_smile:
Não sabia dessa função , isso tem algum nome e pode ser usada em outros exemplos. :?:

ViniGodoy

Não entendi… isso o que tem nome?

E

Eu coloquei um método toString() na minha classe, porque quando adiciono um objeto dessa classe
ao comboBox ele utiliza o toString() automaticamente :?:

Eu só conhecia o toString() como um metodo para converter de Object para String.

ViniGodoy

Se você ler o contrato do método toString() ele diz:
“Fornece uma representação textual para esse objeto”.

Isto é, o toString() não serve para converter objetos, e sim, para fornecer um texto que faça sentido no caso daquele objeto. O nome do cliente é um exemplo de representação textual conveniente para a classe Cliente.

As classes como JComboBox e JListbox sempre tentam exibir a representação textual dos objetos dentro dela. E, para isso, usam o toString().
toString() é um método da classe Object e pode ser sobrescrito, assim como os métodos equals e hashCode. Você simplesmente fez a sobreposição do método.

Criado 6 de maio de 2010
Ultima resposta 7 de mai. de 2010
Respostas 7
Participantes 2