Usando AbstractTableModel com checkbox (RESOLVIDO)

Estive procurando uma solução para o meu problema, mas até agora não encontrei em lugar nenhum! Eu tenho meu próprio TableModel que é de uma classe de parcelas, bem simples. Cada parcela tem seu número, seu valor, sua data de vencimento e se já foi liquidada ou não (boolean). Eu tento mostrar na tabela os dados de cada parcela, porém está dando erro justamente neste campo “liquidado”.

O erro é este:

Exception in thread “AWT-EventQueue-0” java.lang.IllegalArgumentException: Cannot format given Object as a Number

Modelo da tabela

package venda_parcela.tabela;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import venda_parcela.classe.VendaParcelaClasse;
public class VendaParcelaTableModel extends AbstractTableModel {
private static final int COL_NUMERO_PARCELA = 0;
private static final int COL_LIQUIDADO = 1;
private static final int COL_VENCIMENTO = 2;
private static final int COL_VALOR = 3;

private List<VendaParcelaClasse> valores;

public VendaParcelaTableModel(List<VendaParcelaClasse> valores) {
    this.valores = valores;
}

@Override
public int getRowCount() {
    return valores.size();
}
@Override
public int getColumnCount() {
    return 4;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    VendaParcelaClasse classe = valores.get(rowIndex);
    if (columnIndex == COL_NUMERO_PARCELA) {
        return " " + classe.getNumero_parcela();
    } else if (columnIndex == COL_LIQUIDADO) {
        return classe.isLiquidado();
    } else if (columnIndex == COL_VENCIMENTO) {
        return " " + classe.getData_vencimento();
    } else {
        return " " + classe.getValor();
    }
    
}
@Override
public String getColumnName(int column) {
    String coluna = "";
    switch (column) {
        case COL_NUMERO_PARCELA: coluna = "Nº da parcela"; break;
        case COL_LIQUIDADO: coluna = "Liquidado"; break;
        case COL_VENCIMENTO: coluna = "Vencimento"; break;
        case COL_VALOR: coluna = "Valor"; break;
        default: throw new IllegalArgumentException("Coluna inválida!");
    }
    return coluna;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    return (columnIndex == COL_LIQUIDADO);
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    VendaParcelaClasse classe = valores.get(rowIndex);
    if (columnIndex == COL_LIQUIDADO){
        classe.setLiquidado((Boolean) aValue);
    } else if (columnIndex == COL_NUMERO_PARCELA) {
        classe.setNumero_parcela(Integer.valueOf(aValue.toString()));
    } else if (columnIndex == COL_VALOR) {
        classe.setValor(Double.valueOf(aValue.toString()));
    } else if (columnIndex == COL_VENCIMENTO) {
        classe.setData_vencimento(aValue.toString());
    }
    fireTableDataChanged();
}
@Override
public Class<?> getColumnClass(int columnIndex) {
    if (columnIndex == COL_NUMERO_PARCELA) {
        return Integer.class;
    } else if (columnIndex == COL_LIQUIDADO) {
        return Boolean.class;
    } else if (columnIndex == COL_VENCIMENTO) {
        return String.class;
    } else {
        return Double.class;
    }
    
}

public VendaParcelaClasse get(int row) {
    return valores.get(row);
}

}

Classe

package venda_parcela.classe;
public class VendaParcelaClasse {

private Long id;
private Long id_venda;
private Long id_forma_pagamento;
private String forma_pagamento;
private int numero_parcela;
private String data_vencimento;
private String data_pagamento;
private double valor;
private double valor_juros;
private Boolean liquidado;
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
public Long getId_venda() {
    return id_venda;
}
public void setId_venda(Long id_venda) {
    this.id_venda = id_venda;
}
public Long getId_forma_pagamento() {
    return id_forma_pagamento;
}
public void setId_forma_pagamento(Long id_forma_pagamento) {
    this.id_forma_pagamento = id_forma_pagamento;
}
public String getForma_pagamento() {
    return forma_pagamento;
}
public void setForma_pagamento(String forma_pagamento) {
    this.forma_pagamento = forma_pagamento;
}
public int getNumero_parcela() {
    return numero_parcela;
}
public void setNumero_parcela(int numero_parcela) {
    this.numero_parcela = numero_parcela;
}
public String getData_vencimento() {
    return data_vencimento;
}
public void setData_vencimento(String data_vencimento) {
    this.data_vencimento = data_vencimento;
}
public String getData_pagamento() {
    return data_pagamento;
}
public void setData_pagamento(String data_pagamento) {
    this.data_pagamento = data_pagamento;
}
public double getValor() {
    return valor;
}
public void setValor(double valor) {
    this.valor = valor;
}
public double getValor_juros() {
    return valor_juros;
}
public void setValor_juros(double valor_juros) {
    this.valor_juros = valor_juros;
}
public Boolean isLiquidado() {
    return liquidado;
}
public void setLiquidado(Boolean liquidado) {
    this.liquidado = liquidado;
}
@Override
public String toString() {
    return "VendaParcelaClasse{" + "id=" + id + ", id_venda=" + id_venda + ", id_forma_pagamento=" + id_forma_pagamento + ", forma_pagamento=" + forma_pagamento + ", numero_parcela=" + numero_parcela + ", data_vencimento=" + data_vencimento + ", data_pagamento=" + data_pagamento + ", valor=" + valor + ", valor_juros=" + valor_juros + ", liquidado=" + liquidado + '}';
}

}

Aqui é o método que gera as parcelas e joga no table

private void geraParcelas () {
    lista_parcela = new ArrayList<VendaParcelaClasse>();
    
    if (!txtValorTotal.getText().isEmpty()) {
    
        double valor_total = new FormataNumeros().formataEstiloBancoDeDados(txtValorTotal.getText());
        
        if (valor_total > 0) {
            int numero_parcelas = Integer.valueOf(comboNumeroDeParcelas.getSelectedItem().toString());
            double valor_parcela = valor_total / numero_parcelas;
            GregorianCalendar cal = new GregorianCalendar();
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            for (int i = 0; i < numero_parcelas; i++) {
                VendaParcelaClasse classe = new VendaParcelaClasse();
                classe.setNumero_parcela(i+1);
                classe.setData_vencimento(sdf.format(cal.getTime()));
                classe.setLiquidado((Boolean) false);
                classe.setValor(valor_parcela);
                lista_parcela.add(classe);
                cal.add(Calendar.MONTH, 1);
                cal.set(Calendar.DAY_OF_MONTH, 10);
            }
            
            tabelaParcelas.setModel(new VendaParcelaTableModel(lista_parcela));
            if (tabelaParcelas.getRowCount() > 0) {
                tabelaParcelas.setRowSelectionInterval(0, 0);
                tabelaParcelas.scrollRectToVisible(tabelaParcelas.getCellRect(0, 0, true));
            }
        }
    }  
}

Alguém pode me ajudar?

Amigo, você pode colocar o erro completo? está dificil identificar o local exato do erro.

Ao invés disso, corrigir por isso:

  @Override
  public Object getValueAt(int rowIndex, int columnIndex) {
    VendaParcelaClasse classe = valores.get(rowIndex);
    if (columnIndex == COL_NUMERO_PARCELA) {
       return classe.getNumero_parcela();
    } else if (columnIndex == COL_LIQUIDADO) {
       return classe.isLiquidado();
    } else if (columnIndex == COL_VENCIMENTO) {
      return classe.getData_vencimento();
    } else {
      return classe.getValor();
    }

   }

Observações:
1 - Foi retirada as concatenações.
2 - Você tem que ficar atento para o que você define no método getColumnClass, veja:

//VEJA AQUI VOCE DEFINIU O TIPO QUE AS COLUNAS DEVEM TER,
//SENDO ASSIM NO METODO getValueAt VOCE DEVE RETORNAR DE ACORDO
@Override
public Class<?> getColumnClass(int columnIndex) {
    if (columnIndex == COL_NUMERO_PARCELA) {
        return Integer.class;
    } else if (columnIndex == COL_LIQUIDADO) {
        return Boolean.class;
    } else if (columnIndex == COL_VENCIMENTO) {
        return String.class;
    } else {
        return Double.class;
    }

 }
1 curtida

jacoboliveira Era isso mesmo cara, eu nem tinha percebido que as concatenações tornariam as informações String, por isso o erro.
Muito obrigado Satangozo e jacoboliveira pelo apoio, a questão está resolvida!!!

Um abraço a todos!

1 curtida