Ajuda com JTable e AbstractTableModel

Boa tarde!
to com um pequeno problema que nao sei como resolver,
bom, depois de muito olhar, decidi retirar minhas DefaultTableModel e customizar as minhas, que nao sao poucas, aliás!
entao
desenvolvi a primeira, so que ta dando erro!
nao sei se é recomendado colocar o DAO dentro da TableModel, mas coloquei para ficar de melhor entendimento
entao vai minha TableModel:

package sga.tableModels;

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import sga.hibernate.configurations.GenericDAO;
import sga.hibernate.configurations.HibernateUtil;
import sga.hibernate.mapeamento.Usuario;

/**
 *
 * @author Juan Perondi
 */
public class TableModelUsuario extends AbstractTableModel {

    private final int COL_COD_USUARIO = 0;
    private final int COL_NOME_USUARIO = 1;
    private final int COL_EMAIL_USUARIO = 2;
    private final int COL_RG_USUARIO = 3;
    private final int COL_SETOR_USUARIO = 4;
    private final int COL_ENDERECO_USUARIO = 5;

    private final String headers[] = new String[]{"Código", "Nome", "Email", "RG", "Setor", "Endereço"};
    private final int headersSize[] = new int[]{60, 350, 300, 100, 250, 500};

    private List<Usuario> usuarios;

    /**
     *  Construtor Padrao
     **/
    public TableModelUsuario() {
        usuarios = new ArrayList();
       recarregarUsuarios();
    }

    /**
     *  Passando a lusta de Usuarios para ser inserida neste Table
     **/
    public TableModelUsuario(List<Usuario> lista) {
        this();
        usuarios.addAll(lista);
        fireTableDataChanged();
    }

    /**
     *  @return quantidade de itens no Model
     **/
    public int getRowCount() {
        return usuarios.size();
    }

    /**
     *  @return quantidade de colunas
     **/
    public int getColumnCount() {
        return headers.length;
    }

    /**
     *  @return nome das colunas
     **/
    @Override
    public String getColumnName(int column) {
        return headers[column];
    }

    /**
     *  @return classe das colunas
     **/
    @Override
    public Class getColumnClass(int columnIndex) {
        if (columnIndex == COL_COD_USUARIO) {
            return int.class;
        }
        return String.class;
    }

    /**
     *  @return Valor a uma determinada Linha e determinada Coluna
     **/
    public Object getValueAt(int rowIndex, int columnIndex) {

        Usuario user = usuarios.get(rowIndex);
        if (columnIndex == COL_COD_USUARIO) {
            return user.getCodUsuario();
        }

        if (columnIndex == COL_NOME_USUARIO) {
            return user.getNome();
        }

        if (columnIndex == COL_EMAIL_USUARIO) {
            return user.getEMail();
        }

        if (columnIndex == COL_RG_USUARIO) {
            return user.getRg();
        }

        if (columnIndex == COL_SETOR_USUARIO) {
            return user.getSetor();
        }

        if (columnIndex == COL_ENDERECO_USUARIO) {
            return user.getEndereco();
        }
        return "";
    }

    /**
     *  @return uma Lista contendo todos os Usuario
     **/
    public List<Usuario> getAllUsuarios() {
        return usuarios;
    }

    /**
     * Usuario a uma determinada linha
     **/
    public Usuario getUsuario(int index) {
        return usuarios.get(index);
    }

    /**
     * insere um usuario na Tabela e no Banco de Dados
     **/
    public void adicionaUsuario(Usuario user) {
        GenericDAO daoart = new GenericDAO();
        daoart.setObject(user);
        daoart.salvaOuAtualiza();

        usuarios.add(user);
        fireTableDataChanged();
    }

    /**
     * Remove um usuario baseando e sua locaulzacao
     **/
    public void removeUsuario(int index) {
        Usuario user = usuarios.get(index);

        GenericDAO daoart = new GenericDAO();
        daoart.setObject(user);
        daoart.exclui();

        usuarios.remove(index);

        fireTableRowsDeleted(index, index);
    }

    /**
     * Limpa a lista de usuarios
     **/
    public void limpaLista() {
        int i = usuarios.size();
        usuarios.clear();
        fireTableRowsDeleted(0, i - 1);
    }

    /**
     *  Verifica se contem um determinado Usuario
     **/
    public boolean containsUsuario(Usuario user) {
        if (usuarios.contains(user)) {
            return true;
        }
        return false;
    }

    /**
     * @return tamanhos dos cabecalho
     */
    public int[] getHeadersSize() {
        return headersSize;
    }

    public void recarregarUsuarios() {
        limpaLista();
        usuarios.addAll( HibernateUtil.getSession().getNamedQuery("Usuario.findAll").list());
    }
}

pra inserir to fazendo assim:

...
tableModel = new TableModelUsuario();
getTabela().setModel(tableModel);
setSizesColumns(tableModel.getHeadersSize());
getTabela().validate();
...

so que da NullPointer!:

Exception occurred during event dispatching:
java.lang.NullPointerException
        at javax.swing.JTable.prepareRenderer(JTable.java:5729)
        at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2075)
        at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1977)
        at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1773)
        at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
        at javax.swing.JComponent.paintComponent(JComponent.java:763)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
        at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1475)
        at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1406)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1220)
        at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
        at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
        at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)
        at java.awt.Dialog$1.run(Dialog.java:1045)
        at java.awt.Dialog$3.run(Dialog.java:1097)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Dialog.show(Dialog.java:1095)
        at java.awt.Component.show(Component.java:1563)
        at java.awt.Component.setVisible(Component.java:1515)
        at java.awt.Window.setVisible(Window.java:841)
        at java.awt.Dialog.setVisible(Dialog.java:985)
        at sga.tela.principais.JCadUsuarios$9.run(JCadUsuarios.java:252)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Não sei o que estou fazendo de errado!
alguem tem uma dica ai?

resolvi o problema do NullPointerExceptio, faltava o metodo getValueAt
so que tenho um outro problema, a tenho um JTextField pode filtrar minha via Regex…
filtra normalmente,
quando pego o row() da jtable ele retorna o da lista, nao aquele que esta filtrado!
alguem tem uma solucao ou ja passou por isso?