Dúvida sobre erro em uma jTable com checkBox [Resolvido]

1 resposta
raptor.x

Boa tarde a todos,

Estou seguindo o exemplo linkado aqui no forum pelo amigo ViniGodoy -> http://www.javasimples.com.br/swing-awt/death-to-defaulttablemodel-abstracttablemodel-rulez/ Montei todo o exemplo adequando com os campos de minha tabela de clientes, no entanto ao chamar a tela é apresentado o seguinte erro:
Exception occurred during event dispatching: java.lang.NullPointerException at javax.swing.JTable.prepareRenderer(JTable.java:5720) at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072) at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1974) . . .
Minha classe Abstract esta montada da seguinte forma:
public class MensalistaTableModel extends AbstractTableModel {
    //constantes que vão representar as colunas
    //(só para facilitar o entendimento do código)
    private final int COL_NOME = 0;
    private final int COL_END = 1;
    private final int COL_TEL = 2;
    private final int COL_CPF = 3;
    private final int COL_SITU = 4;
    //lista dos mensalistas que serão exibidos
    private List<Mensalista> mensalistas;

    public MensalistaTableModel() {
        mensalistas = new ArrayList();
    }

    public MensalistaTableModel(List<Mensalista> lista) {
        this();
        mensalistas.addAll(lista);
    }

    public int getRowCount() {
        //cada produto na lista será uma linha
        return mensalistas.size();
    }

    public int getColumnCount() {
        //vamos exibir só Nome e Quantidade, então são 2 colunas
        return 5;
    }

    @Override
    public String getColumnName(int column) {
        //qual o nome da coluna
        if (column == COL_NOME)
            return "Nome";
        else if (column == COL_END)
            return "Endereço";
        else if (column == COL_TEL)
            return "Telefone";
        else if (column == COL_CPF)
            return "Cpf";
        else if (column == COL_SITU)
            return "Ativo";
      return "";
    }

    @Override
    public Class getColumnClass(int columnIndex) {
        //retorna a classe que representa a coluna
        if (columnIndex == COL_NOME)
            return String.class;
        else if (columnIndex == COL_END)
            return String.class;
        else if (columnIndex == COL_TEL)
            return String.class;
        else if (columnIndex == COL_CPF)
            return String.class;
        else if (columnIndex == COL_SITU)
            return boolean.class;
      return String.class;
    }


    public Object getValueAt(int rowIndex, int columnIndex) {
        //pega o produto da linha
        Mensalista m = mensalistas.get(rowIndex);
    
        //verifica qual valor deve ser retornado
        if (columnIndex == COL_NOME)
            return m.getNome();
        else if (columnIndex == COL_END)
            return m.getEndereco();
        else if (columnIndex == COL_TEL)
            return m.getTelefone();
        else if (columnIndex == COL_CPF)
            return m.getCpf();
        else if (columnIndex == COL_SITU)
            return m.getSituacao();

      return "";
    }
    
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //Dados da tabela não editaveis
        return false;
    }
Estou chamando a tela, carregando o modelo logo no construtor por meio do metodo carregarTabela. Já verifiquei e o conteúdo do ArrayList não esta nulo.
public ConsultaMensalistaUI() {
        initComponents();
        try {
            carregarTabela();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ConsultaMensalistaUI.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ConsultaMensalistaUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void carregarTabela() throws ClassNotFoundException, SQLException{
        ultimoCod=4;
        PessoaControl pc = new PessoaControl();
        List<Mensalista> listagem = new ArrayList<Mensalista>(pc.buscaMensalista());
        modelo = new MensalistaTableModel(listagem);
        jTableMensalista.setModel(modelo);
    }

Grato a quem puder me dar uma ajudinha!

1 Resposta

raptor.x

Problema resolvido:

Na linha 59 da minha classe AbstractModel:
return boolean.class; 
//Mudei para
return Boolean class;
Coisa muito simples, mas deu bastante trabalho! Só pra complementar, também deixo os seguintes métodos para alterações que eventualmente forem feitas nas células, inclusive alterações no checkBox da coluna booleana:
@Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //pega o produto da linha
        Mensalista m = mensalistas.get(rowIndex);
       
        //verifica qual valor vai ser alterado
        if (columnIndex == COL_NOME)
            m.setNome(aValue.toString());
        else if (columnIndex == COL_END)
            m.setEndereco(aValue.toString());
        else if (columnIndex == COL_TEL)
            m.setTelefone(aValue.toString());
        else if (columnIndex == COL_CPF)
            m.setCpf(aValue.toString());
        else if (columnIndex == COL_SITU)
            check.set(rowIndex, (Boolean) aValue);

        //avisa que os dados mudaram
        fireTableDataChanged();
    }

    public boolean isChecked(Mensalista mens) {
        return check.get(this.mens.indexOf(mens)) == Boolean.TRUE;
    }
Abraço a todos!!!
Criado 28 de outubro de 2011
Ultima resposta 29 de out. de 2011
Respostas 1
Participantes 1