Comparações entre Objetos para popular JComboBox

tenho um JComBox q eh populado por objetos de uma classe

[code]package TO;

public class CategoriaTO {

private int id;
private String Descricao;

public String getDescricao() {
    return Descricao;
}

public int getId() {
    return id;
}

public void setDescricao(String Descricao) {
    this.Descricao = Descricao;
}

public void setId(int id) {
    this.id = id;
}

/**
* Faz com que a descrição seja mostrada no combo
*/  
@Override

public String toString() {
return this.getDescricao();
}

}[/code]

Classe Produto

[code]package TO;

import DAO.CategoriaDAO;
import DAO.FornecedorDAO;
import java.sql.SQLException;

public class ProdutoTO {

private int id;
private String Descricao;
//...
private CategoriaTO categoriaTO;

 public CategoriaTO getCategoriaTO() {
    return categoriaTO;
}
public void setCategoriaTO(CategoriaTO categoriaTO) {
    this.categoriaTO = categoriaTO;
}

//RECEBE ID DA CONSULTA NO BANCO E REALIZA A CONSULTA PARA POPULAR O OBJETO categoriaTO
public void setCategoriaTO(int id_categoria) throws SQLException {
this.categoriaTO = new CategoriaDAO().Consultar(id_categoria);
}
//…
@Override
public String toString() {
return this.getDescricao();
[/code]
e com esse objeto categoria eu populo o banco…mas na hora q eu quero pegar um certo produto ja cadastrado e editar eu quero q o combo ja mostre selecionado a categoria q esta cadastrada no banco mas na hora q eu comparo

Combo.SetSelectedItem(objetoProduto.CategoriaTO().getDescricao());

ele nao consegue achar ja mandei imprimir o valor do combo e eh identico, porque nao consigo fazer essa verificação?
}

o valor que aparece no combobox é o mesmo do Object.toString() que esta nele

porem quando vc vai setar o seu valor, vc deve setar com o Object e não com o toString()

tente assim


combo.setSelectedItem(objetoProduto.CategoriaTO());  

So pra esclarecer… par ao combobox o que esta nele é sermpre um Object, ele nunca pensa que tem uma string la… e ele sempre usa o método Object.toString() para exibir o conteudo do objeto. e o metodo Object.equals(selectedItem) para encontrar o valor que vc esta passando no set

Portanto nunca sete pelo texto, e sim pelo proprio objeto

Oi gente, estou entando add diretorios em um comboBox a uma semana alguem sabe com se add diretorios em comboBox, podem postar algum codigo?
por favor! :oops:

mas eu tentei comparar pelo objeto tambem mas ele nao consegue fazer a comparação nao seleciona o meu item no JComboBox

[quote=samea]Oi gente, estou entando add diretorios em um comboBox a uma semana alguem sabe com se add diretorios em comboBox, podem postar algum codigo?
por favor! :oops:[/quote]

Não seria isso?

[code]// Cria os itens da lista
String nomes[] = {“Carlos”, “Marcelo”, “Fabiana”,
“Carolina”, “Osmar”};

// Cria o JComboBox
combo = new JComboBox(nomes);[/code]

o que você quer dizer com diretorios?

mostra ai o código que vc usou pra popular o COmbobox…
a parte que tem …
combobox.setModel(…) ou new JComboBox(…);

vc so pode dar setSelectedCOmboBox, em um Objeto que vc tenha adcionado no combobox pelo seu model

Populando comboCategoria

private void ObterRegistroCategoria() { try { ListaCategoria = categoriaDAO.Consultar(); int i = 0; while (i < ListaCategoria.size()) { categoriaTO = (CategoriaTO) ListaCategoria.get(i); i++; } Categoria.addAll(ListaCategoria); } catch (Exception e) { e.printStackTrace(); } }

ListaCategoria eh do tipo List essa consulta me retorna uma lista com varios objetos do tipo CategoriaTO onde tenho ID e Descricao na classe CategoriaTO eu do um override no metodo ToString() para retorna Descricao…assim populo meu combo soh com a descricao do objeto CategoriaTO

private void PopulaComboCategoria() { ObterRegistroCategoria(); cbCategoria.setModel(new javax.swing.DefaultComboBoxModel(Categoria)); }

como esse objeto funciona ??

Categoria.addAll(ListaCategoria); … o.O vc inciia objeto com letras maiusculas ?? ou isso é uma classe estatica ??

preciso saber o que vc esta insirindo dentro do combo box… quais objetos estão indo ali pro cbox…

veja que vc faz depois

cbCategoria.setModel(new javax.swing.DefaultComboBoxModel(Categoria));

portanto isso é o importante… saber como Categoria adciona a lista de categoria…

lembrando que… c vc adciona uma List<CategoriaTO> (Categoria é um objeto do tipo List<CategoriaTO> ??? ) dentro do model… dentro dele vai ter objetos CategoriaTO e não objetos String … mesmo o combobox mostrando CategoriaTO.toString() … o que esta la é o CategoriaTO e não a string…

sendo assim, se esse for o caso, vc tem que olhar como CategoriaTO implementa .equals(Object o) … para garantir que quando objetos com o mesmo conteúdo forem comparado, o seu sistema retorne true, para esse equals… pois é isso que o combobox vai fazer na hora que vc der set! no combobox

CategoriaTO eh um objeto dessa classe

[code]
package TO;

public class CategoriaTO {

private int id;
private String Descricao;

public String getDescricao() {
    return Descricao;
}

public int getId() {
    return id;
}

public void setDescricao(String Descricao) {
    this.Descricao = Descricao;
}

public void setId(int id) {
    this.id = id;
}

/**
* Faz com que a descrição seja mostrada no combo
*/  
@Override

public String toString() {
return this.getDescricao();
}

}[/code]

E assim eu pego as categorias do banco e adiciono no meu ArrayList

[code] public List Consultar() throws SQLException {
ArrayList list = new ArrayList();

    CategoriaTO categoria = new CategoriaTO();

    PreparedStatement stmt = this.connection.prepareStatement("SELECT * FROM categoria");
    try {
        ResultSet resultado = stmt.executeQuery();

        categoria = new CategoriaTO();
        categoria.setId(new Integer(0));
        categoria.setDescricao("SELECIONE");
        list.add(categoria);

        while (resultado.next()) {
            categoria = new CategoriaTO();
            categoria.setId(new Integer(resultado.getInt(1)));
            categoria.setDescricao(resultado.getString(2));
            list.add(categoria);
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    } finally {
        stmt.close();
    }
    return list;
}

}[/code]

bom, neste caso, me como vc não usa ferramentas de persisencia, vc deve ter 2 intancias da mesma row de uma tabela… o que acontece
vc esta adcionando varios objetos a um combobox…

na hora que vc faz

combobox.setSelectedItem(meuEspecificoCategoriaTO);

o combobox vai testar se a sua lista comtem o meuEspecificoCategoriaTO, e ele testa se contem usando .equals … como vc não implementou o .equals no seu CategoriaTO objeto… ele vai testar se o meuEspecificoCategoriaTO.hashCode() é igual a alguem que esta dentro do objeto… e isso só sera verdade quando a instancia dos 2 são iguais…

vamos entender assim

[code]CategoriaTO cat1 = new CategoriaTO();
CategoriaTO cat2 = new CategoriaTO();

cat1.setId(10);
cat1.setDescricao(“desc teste”);

cat2.setId(10);
cat2.setDescricao(“desc teste”);

//mesmo os 2 contendo o mesmo valor, c vc fizer
if (cat1 == cat2)
System.out.println(“Isso sempre retorna falso, não tem o que fazer pois são objetos diferentes”);

if (cat1.equals(cat2))
System.out.println(“Isso só esta retornando falso, pq vc não implementou o equals, e assim o objeto não sabe como testar igualdade”);[/code]

sendo assim a solução para vc seria implementar o método equals do seu CategoriaTO

[code]public class CategoriaTO {
//…

public boolean equals(Object o) {
    if (o instanceof CategoriaTO)
            equals((CategoriaTO)o);
    if (o instanceof String)
            equals((String)o);
    return false;
}

public boolean equals(CaegoriaTO categoria) {
    return categoria.id == this.id; //se vc quiser vc pode testar a String tb e so voltar verdadeiro se o ID e String forem iguais
}
//Esse equals aqui c vc quiser não precisa... mais com ele vc pode fazer ... categoria.equals("Descricao"); e saber c a descrição bate ^^
public boolean equals(String descricao) {
    return this.descricao.equals(descricao);
}

}[/code]

da uma olhada neste post aqui qualquer coisa http://www.guj.com.br/posts/list/116766.java
acabei de explicar prum cara essa mesma coisa de hashcode e equals

implemente tambem o hashChode pra funcionar.

como implemento tambem o metodo hashCode(); ?

desse modo eu consigo comparar objetos da classe CategoraTO mas mesmo assim nao obtive resultado soh se eu instanciar um novo objeto e setar os atributos iguais ele faz a comparação correta