TableModel com ComboBox/ComboBoxModel

15 respostas
R

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

15 Respostas

DeGuedes

Como esta sua classe Table Model?

Pois para retornar um objeto vc precisa fazer mais ou menos isso:
@Override
    public Class<?> getColumnClass(int coluna) {
        // todas as colunas representam uma String
        if (coluna == 2) {
            return Produtos.class;
        }

        return String.class;
    }

[]'s

R

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

DeGuedes

Posta como estao suas classes…

:wink:

[]'s

R

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);
}
DeGuedes

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…

R

Tens um exemplo?

Desde já valeu pelo interesse.

DeGuedes
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();
    }
}

e na minha classe eu faço assim:

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

[]'s

R

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??

DeGuedes

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…

R

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??

DeGuedes

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

DeGuedes

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??

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

R

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

Abraço

R

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

DeGuedes

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

Abraço

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

[]'s

Criado 22 de fevereiro de 2011
Ultima resposta 22 de fev. de 2011
Respostas 15
Participantes 2