Checkbox em Jtable com modelo proprio?

Olá Amigos.
Preciso de uma ajuda com o modelo abaixo, criei ele seguindo um tutorial mas não estou conseguindo implementar a logica para que o checkbox da primeira coluna fique editavel.
Preciso que esse checkbox seja marcado ao clicar e desmarcado ao clicar novamente possibilitando a seleção de linhas alternadas na minha tabela.
Alguem sabe como implementar isso em AbstractTableModel?



package aaamain;

import java.util.ArrayList;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.table.AbstractTableModel;

public class ModeloTabela extends AbstractTableModel {


private static final long serialVersionUID = 1L;
List<Pessoas>             pessoas          = new ArrayList<Pessoas>();
String[]                  colunas          = new String[] { "boleano", "nome", "idade", "icone" };




@Override
public String getColumnName(int column) {

	return colunas[column];
}

@Override
public Class<?> getColumnClass(int columnIndex) {

	switch (columnIndex) {
	case 0:
		return Boolean.class;

	case 1:
		return String.class;

	case 2:
		return Integer.class;

	case 3:
		return ImageIcon.class;

	}
	return null;
}


public int getRowCount() {
	return pessoas.size();
}

public int getColumnCount() {

	return colunas.length;
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
	switch (columnIndex) {
	case 0: // CheckBox
		return true;
	case 1: // CheckBox
		return false;
	default:
		return false;
	}
}

public Object setValueAt(int rowIndex, int columnIndex) {
	switch (columnIndex) {
	case 0:
		return pessoas.get(rowIndex).isAtivo() ? false : true;
	case 1:
		return pessoas.get(rowIndex).getNome();

	case 2:
		return pessoas.get(rowIndex).getIcone();

	case 3:
		return pessoas.get(rowIndex).getIcone();


	}
	fireTableCellUpdated(rowIndex, columnIndex);
	return null;


}


public Object getValueAt(int rowIndex, int columnIndex) {


	switch (columnIndex) {
	case 0:

		return pessoas.get(rowIndex).isAtivo();


	case 1:
		return pessoas.get(rowIndex).getNome();

	case 2:
		return pessoas.get(rowIndex).getIcone();

	case 3:
		return pessoas.get(rowIndex).getIcone();

	}
	fireTableCellUpdated(rowIndex, columnIndex);
	return null;
}


public void addRow(int rowIndex, int columnIndex) {
	this.addRow(rowIndex, columnIndex);
	this.fireTableDataChanged();
}


public void addRow(Pessoas p) {
	this.pessoas.add(p);

	this.fireTableDataChanged();
}


}

Tem coisa estranha no seu código:

Isso aqui não faz sentido, pois se você chamar esse método, vai ter um StackOverflowError:

public void addRow(int rowIndex, int columnIndex) {
    this.addRow(rowIndex, columnIndex);
    this.fireTableDataChanged();
}

Também não faz sentido você chamar o método fireTableCellUpdated dentro do método getValueAt.