TableModel com ComboBox/ComboBoxModel

Pessoal, estou tentando criar um combobox em um Jtable (parecido com um lookupcombobox),
porém estou tenho trabalho.
Criei o CellEditor,CellRenderer, só o problema está quando quero exibir um texto no combobox e salvar um objeto (setValueAt) no tablemodel.
Pois na hora do setValueAt , ele tenta setar a string no tablemodel, sendo que na verdade quero dar um set no objeto.
O set eu estou dando em uma lista utilizada para popular o JTable, utilizando tablemodel

É muito parecido com LookupComboBox do delphi.


Rodrigo

Como esta sua classe Table Model?

Pois para retornar um objeto vc precisa fazer mais ou menos isso:

[code]
@Override
public Class<?> getColumnClass(int coluna) {
// todas as colunas representam uma String
if (coluna == 2) {
return Produtos.class;
}

    return String.class;
}[/code]

[]'s

Exatamente como tu colocaste, na coluna do combobox retorno a classe.

Posta como estao suas classes…

:wink:

[]'s

Segue abaixo o codigo.

/**
Combo Box Model
*/
public class ComboModelCorr extends AbstractListModel implements ComboBoxModel {
private Listlista;
private Corrugados selecionado;

public ComboModelCorr(List<Object>lista) {
    this.lista=lista;
}

public int getSize() {
    return lista.size();
}

public Object getElementAt(int index) {
    return lista.get(index);
}

public void setSelectedItem(Object anItem) {
    //selecionado=am;
    selecionado=  (Corrugados) anItem;
}

public Object getSelectedItem() {     
       return selecionado;
}

//table model
public class TableModelCalculo extends AbstractTableModel {

private List<Object> lista; 
private DecimalFormat df;

//pega a lista e popula a tabela.. isso é que é legal do table model
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Object objeto = getLista().get(rowIndex);

    if (objeto != null) {
        Object[] obj = new Object[6];
        //cast

        obj[0] =((CorrugadoEscolhido)).getCorrugado;//aqui é o objeto e tambem o combo
        obj[1] =((CorrugadoEscolhido)).getQuantidade;


        return obj[columnIndex];
    }
    return null;
}

@Override
public Class<?> getColumnClass(int columnIndex) {
    if (columIndex==0){
       return Corrugados.class;
    }
    
   return BigDecimal.class;
  

}

public void setValueAt(Object value, int row, int col) {

    Object objeto = getLista().get(row);



   
    switch (col) {
        case 0: //Name
            ((CorrugadoEscolhido) objeto).setCorrugado((Corrugado)value); //aqui dou um set no corrugado para gravar na lista de corrugados escolhidos, nesse momento ele pega do combobox, mas entao pega a string e dispara uma exceção, pois esperava um objeto do tipo corrugado
            break;
        case 1: //value
           ((CorrugadoEscolhido) objeto).setQuantidade(new BigDecimal(value.toString()));
            break;
     }
    //diz para o listenar que a tabela teve alterações
    fireTableCellUpdated(row, col);
}

Cara eu faço diferente, eu crio uma classe com extends AbstractCellEditor implements TableCellEditor

cara eu axo q o problema esta na sua classe do combo… ela deve estar retornando uma String ao inves do objeto…

Tens um exemplo?

Desde já valeu pelo interesse.

[code]
public class ComboProd extends AbstractCellEditor
implements TableCellEditor {

private JComboBox field;
private Produtos[] values = {};
private List<Produtos> lpro = new ArrayList<Produtos>();
private ProdutosJpaController projpa = new ProdutosJpaController();

@Override
public Component getTableCellEditorComponent(JTable table,
        Object value, boolean isSelected, int row, int column) {
    lpro = projpa.findProdutosEntities();
    field = new JComboBox(values);
    field.addItem("");
    for (int i = 0; i < lpro.size(); i++) {
        field.addItem(lpro.get(i));
    }
    field.setSelectedItem(value); //Deixa o editor pré-selecionado com o valor da célula
    return field;
}

@Override
public Object getCellEditorValue() {
    return field.getSelectedItem();
}

}[/code]

e na minha classe eu faço assim:

jTableProd.setDefaultEditor(Produtos.class, new ComboProd());

[]'s

Mais uma duvida,
vejo que vc adicionou no combo objetos do tipo PRODUTO, a minha duvida é o que vc mostra efetivamente quando o usuario clica no combo??
Mostra a descrição do produto??. Se for isso em qual momento vc faz, no Renderer do JTable??

O que aparece é o nome dele… na classe Produtos tem essa parte aqui:

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

OBs: Uso Hibernate na criação dessa classe…

Entendo, uso tambem o hibernate. Mas não tenho esse metodo toString, talvez seja isso que esteja faltando, pois o combo deve chamar IMPLICITAMENTE,
o metodo toString, ou vc chama em algum outro lugar??

Implicitamente… esse metodo é Override… automaticamente quando eu seto esse objeto em algum combo, por exemplo, ele me retorna o nome dele… e quando eu faço o setValueAt, ele retorna o objeto certinho… ;D

[]'s

[quote=rodjle]Entendo, uso tambem o hibernate. Mas não tenho esse metodo toString, talvez seja isso que esteja faltando, pois o combo deve chamar IMPLICITAMENTE,
o metodo toString, ou vc chama em algum outro lugar??

[/quote]

Tens certeza q nao tem isso na sua classe do Hibernate??

 @Override
    public int hashCode() {
        int hash = 0;
        hash += (codigo_produto != null ? codigo_produto.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the codigo_produto fields are not set
        if (!(object instanceof Produtos)) {
            return false;
        }
        Produtos other = (Produtos) object;
        if ((this.codigo_produto == null && other.codigo_produto != null) || (this.codigo_produto != null && !this.codigo_produto.equals(other.codigo_produto))) {
            return false;
        }
        return true;
    }

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

Em todas as minhas classes geradas pelo Hibernate tem isso…

[]'s

Cara muito obrigado , você me ajudou muito.
Irei agora proseguir com as dicas que você me deu.

Abraço

Eu tirava fora esse codigo que o hibernate gerava extra, pois achava que nao necessitava.

[quote=rodjle]Cara muito obrigado , você me ajudou muito.
Irei agora proseguir com as dicas que você me deu.

Abraço[/quote]

Blza cara… tenta por de novo esses codigos… e qlqr coisa posta ai!

[]'s