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
/**
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);
}
[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());
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??
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
[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…