Criação do meu próprio TableModel[Resolvido]

Olá amigos estou com um problema, estou tentando trabalhar com o AbstractTableModel, estou achando ótimo diante do horrível DefaultTableModel,
eu consigo listar os dados no TableModel mas a questão de alteração direto na linha( celula por celula) já nao consigo fazer, ja olhei os exemplos do forum
mas ainda nao consegui, gostaria que elaborar todos os passos que o TableModel nos oferece, como edição, exclusão, inserção e etc…

segue meus códigos…

/*Meu model*/
/*Entidade bov_piquete responsavel pelo modelo do objeto piquete*/


import java.sql.Date;

public class Bov_piquete {
	private int id;
	private String nome;
	private double tamanho;
	private int capacidade_bov;
	private int capacidade_dias;
	private String situacao;
	private Date dt_cadastro;
	private Date dt_alteracao;
	
	
	
	/**
	 * 
	 */
	public Bov_piquete() {
		super();
		// TODO Auto-generated constructor stub
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public double getTamanho() {
		return tamanho;
	}
	public void setTamanho(double tamanho) {
		this.tamanho = tamanho;
	}
	public int getCapacidade_bov() {
		return capacidade_bov;
	}
	public void setCapacidade_bov(int capacidade_bov) {
		this.capacidade_bov = capacidade_bov;
	}
	public int getCapacidade_dias() {
		return capacidade_dias;
	}
	public void setCapacidade_dias(int capacidade_dias) {
		this.capacidade_dias = capacidade_dias;
	}
	public String getSituacao() {
		return situacao;
	}
	public void setSituacao(String situacao) {
		this.situacao = situacao;
	}
	public Date getDt_cadastro() {
		return dt_cadastro;
	}
	public void setDt_cadastro(Date dt_cadastro) {
		this.dt_cadastro = dt_cadastro;
	}
	public Date getDt_alteracao() {
		return dt_alteracao;
	}
	public void setDt_alteracao(Date dt_alteracao) {
		this.dt_alteracao = dt_alteracao;
	}
	
	
}
/*Minha tablemodel - */


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

import javax.swing.JOptionPane;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import br.com.freedom.model.Bov_piquete;

public class Bov_piquete_TableModel extends AbstractTableModel{
	private List<Bov_piquete> linhas;
	private static final String[] colunas = new String[]{"<html><b><i>Nome</i></b></html>",
														"<html><b><i>Tamanho</i></b></html>",
														"<html><b><i>Cap. bovinos</i></b></html>",
														"<html><b><i>Cap. dias</i></b></html>",
														"<html><b><i>Situação</i></b></html>"};
	
	/*Cria um Bov_piquete_TableModel vazio */
	public Bov_piquete_TableModel() {
		linhas = new ArrayList<Bov_piquete>();
		
		this.addTableModelListener(new TableModelListener() {
			 
	           @Override
	           public void tableChanged(TableModelEvent tme) {
	               int linha = tme.getFirstRow();
	               Bov_piquete p = new Bov_piquete();
	               JOptionPane.showMessageDialog(null, "ola");
	               // aqui você atualiza no banco ou em outro lugar qualquer
	           }
	       } );
	}
	
	
//	/*Cria um Bov_piquete_TableModel com a lista de piquetes especifidas*/
	public Bov_piquete_TableModel(List<Bov_piquete> lista_piquetes){
		linhas = new ArrayList<Bov_piquete>(lista_piquetes);
	}
	
	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return colunas.length;
	}

	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return linhas.size();
	}
	
	/* Retorna o nome da coluna no índice especificado.
	 * Este método é usado pela JTable para saber o texto do cabeçalho. */
	@Override
	public String getColumnName(int columnIndex) {
		// Retorna o conteúdo do Array que possui o nome das colunas
		// no índice especificado.
		return colunas[columnIndex];
	};
	
	/* Retorna a classe dos elementos da coluna especificada.
	 * Este método é usado pela JTable na hora de definir o editor da célula. */
	@Override
	public Class<?> getColumnClass(int columnIndex) {
		// Retorna a classe referente a coluna especificada.
		// Aqui é feito um switch para verificar qual é a coluna
		// e retornar o tipo adequado. As colunas são as mesmas
		// que foram especificadas no array "colunas".
		switch (columnIndex) {
		case 0: // Primeira coluna é o id, que é uma Integer.
			return String.class;
		case 1: // Segunda coluna é o idcontador, que também é um Contador..
			return Double.class;
		case 2: // Terceira coluna é tipo_atividade.
			return Integer.class;
		case 3: // Quarta coluna tipo pessoa - String.
			return Integer.class;
		case 4: // Quarta coluna tipo pessoa - String.
			return String.class;
			
		default:
			// Se o índice da coluna não for válido, lança um
			// IndexOutOfBoundsException (Exceção de índice fora dos limites).
			// Não foi necessário verificar se o índice da linha é inválido,
			// pois o próprio ArrayList lança a exceção caso seja inválido.
			throw new IndexOutOfBoundsException("Coluna nao encontrada");
		}
	}
	
	/* Retorna o valor da célula especificada
	 * pelos índices da linha e da coluna. */
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		// Pega o sócio da linha especificada.
		Bov_piquete piquete = linhas.get(rowIndex);

		// Retorna o campo referente a coluna especificada.
		// Aqui é feito um switch para verificar qual é a coluna
		// e retornar o campo adequado. As colunas são as mesmas
		// que foram especificadas no array "colunas".
		switch (columnIndex) {
		case 0: // Primeira coluna é o id, que é uma Integer.
			return piquete.getNome();
		case 1: // Segunda coluna é o idcontador, que também é um Contador..
			return piquete.getTamanho();
		case 2: // Terceira coluna é tipo_atividade.
			return piquete.getCapacidade_bov();
		case 3: // Quarta coluna tipo pessoa - String.
			return piquete.getCapacidade_dias();
		case 4: // Quinta coluna tipo_empresa - String.
			return piquete.getSituacao();
			
		default:
			// Se o índice da coluna não for válido, lança um
			// IndexOutOfBoundsException (Exceção de índice fora dos limites).
			// Não foi necessário verificar se o índice da linha é inválido,
			// pois o próprio ArrayList lança a exceção caso seja inválido.
			throw new IndexOutOfBoundsException("coluna index nao encontrada");
		}
	}
	
	/* Seta o valor da célula especificada
	 * pelos índices da linha e da coluna.
	 * Aqui ele está implementado para não fazer nada,
	 * até porque este table model não é editável. */
    public void setValueAt(Object value, int row, int col){         
       
    }  
	
	/* Retorna um valor booleano que define se a célula em questão
	 * pode ser editada ou não.
	 * Este método é utilizado pela JTable na hora de definir o editor da célula.
	 * Neste caso, estará sempre retornando false, não permitindo que nenhuma
	 * célula seja editada. */
	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return true;
	}
	
////////////////////////////////////////////////////////////
	// Os métodos declarados até aqui foram as implementações //
	// de TableModel, que são continuamente utilizados        //
	// pela JTable para definir seu comportamento,            //
	// por isso o nome Table Model (Modelo da Tabela).        //
	//                                                        //
	// A partir de agora, os métodos criados serão            //
	// particulares desta classe. Eles serão úteis            //
	// em algumas situações.                                  //
	////////////////////////////////////////////////////////////


	/* Retorna a empresa da linha especificada. */
	public Bov_piquete getPiquete(int indiceLinha) {
		return linhas.get(indiceLinha);
	}
	
	/* Adiciona um registro. */
	public void addPiquete(Bov_piquete piquete) {
		this.linhas.add(piquete);
        this.fireTableDataChanged();
	}

	/* Remove a linha especificada. */
	public void removePiquete(int indiceLinha) {	
		linhas.remove(indiceLinha);
		this.fireTableRowsDeleted(indiceLinha, indiceLinha);
	}

//	public void addPiquete(Bov_piquete p){
//		linhas.add(p);
//		int ultimoIndice = getRowCount()-1;
//		this.fireTableRowsInserted(ultimoIndice, ultimoIndice);
//		
//	}
	/* Adiciona uma lista de sócios ao final dos registros. */
	public void addListaDeUfs(List<Bov_piquete> piquetes) {
		// Pega o tamanho antigo da tabela.
		int tamanhoAntigo = getRowCount();

		// Adiciona os registros.
		linhas.addAll(piquetes);

		// Reporta a mudança. O JTable recebe a notificação
		// e se redesenha permitindo que visualizemos a atualização.
		fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
	}

	/* Remove todos os registros. */
	public void limpar() {
		// Remove todos os elementos da lista de sócios.
		linhas.clear();

		// Reporta a mudança. O JTable recebe a notificação
		// e se redesenha permitindo que visualizemos a atualização.
		fireTableDataChanged();
	}

	/* Verifica se este table model está vazio. */
	public boolean isEmpty() {
		return linhas.isEmpty();
	}
	
	public void atualizar(int row, Bov_piquete piquete){
        linhas.set(row, piquete);
        this.fireTableRowsUpdated(row, row);
    }
	
	public void notifyUpdated(Bov_piquete bv) {  
		   int index = linhas.indexOf(bv);  
		   bv = getPiquete(index);
		   fireTableRowsUpdated(index, index);  
	}

}
/*Minha view*/

import java.awt.BorderLayout;

public class View_Lista_Piquetes extends JDialog {

	private JTable tblPiquetes;
	private Bov_piquete_TableModel model;
	private final JPanel contentPanel = new JPanel();
	private JPanel panelTable = new JPanel();
	private JTextField txtBuscarPiquete;
	private final JButton btnNovo = new JButton("");
	Bov_piquete_dao dao = new Bov_piquete_dao();
	Bov_piquete piquete = new Bov_piquete();

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try {
			View_Lista_Piquetes dialog = new View_Lista_Piquetes();
			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			dialog.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the dialog.
	 */
	public View_Lista_Piquetes() {
		setIconImage(Toolkit.getDefaultToolkit().getImage(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btAtendimentos.png")));
		setTitle("Lista de piquetes");
		setBounds(100, 100, 725, 442);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(new BorderLayout(0, 0));
		listarPiquetes("");
		
		
		{
			JPanel panelBusca = new JPanel();
			panelBusca.setBackground(Color.WHITE);
			contentPanel.add(panelBusca, BorderLayout.NORTH);
			panelBusca.setLayout(new MigLayout("", "[91px][grow]", "[14px]"));
			
			JLabel lblNomeDoPiquete = new JLabel("Nome do piquete : ");
			lblNomeDoPiquete.setHorizontalAlignment(SwingConstants.CENTER);
			panelBusca.add(lblNomeDoPiquete, "cell 0 0,alignx trailing,aligny center");
			
			txtBuscarPiquete = new JTextField();
			txtBuscarPiquete.addKeyListener(new KeyAdapter() {
				@Override
				public void keyReleased(KeyEvent arg0) {
					listarPiquetes(txtBuscarPiquete.getText().toString());
				}
			});
			panelBusca.add(txtBuscarPiquete, "cell 1 0,growx");
			panelBusca.setBorder(new MatteBorder(2, 2, 2, 2, (Color) Color.BLACK)); 
			txtBuscarPiquete.setColumns(10);
			txtBuscarPiquete.setBorder(new MatteBorder(1, 1, 1, 1, (Color) Color.BLACK)); 
		}
		{
			panelTable = new JPanel();
			contentPanel.add(panelTable, BorderLayout.CENTER);
			panelTable.setBorder(new MatteBorder(2, 2, 2, 2, (Color) Color.BLACK)); 
			panelTable.setLayout(new GridLayout(0, 1, 0, 0));
			JScrollPane scrollPane = new JScrollPane(getTblPiquetes());
			panelTable.add(scrollPane);
			
			
			
		}
		{
			JPanel buttonPane = new JPanel(); 
			buttonPane.setBorder(new EtchedBorder(EtchedBorder.RAISED, Color.BLACK, null));
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
			buttonPane.setLayout(new GridLayout(0, 10, 0, 0));
			btnNovo.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					listarPiquetes("");
				}
			});
			btnNovo.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btNovo.png")));
			buttonPane.add(btnNovo);
			btnNovo.setToolTipText("<html><i>Inserir novo registro</i></html>");
			btnNovo.setActionCommand("OK");
			{
				JButton btnSalvar = new JButton("");
				btnSalvar.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						atualizar();
					}
				});
				btnSalvar.setToolTipText("<html><i>Salvar altera\u00E7\u00F5es</i></html>");
				btnSalvar.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btSalvar-old.png")));
				btnSalvar.setActionCommand("OK");
				buttonPane.add(btnSalvar);
				getRootPane().setDefaultButton(btnSalvar);
			}
			{
				JButton btnFormCadastro = new JButton("");
				btnFormCadastro.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						View_Cadastro_Piquete cad_piquete = new View_Cadastro_Piquete();
						cad_piquete.setModal(true);
						cad_piquete.toFront();
						cad_piquete.setLocationRelativeTo(null);
						cad_piquete.setResizable(false);
						cad_piquete.setVisible(true);
					}
				});
				btnFormCadastro.setToolTipText("<html><i>Exibir formul\u00E1rio em detalhes</i></html>");
				btnFormCadastro.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btCopiar.png")));
				btnFormCadastro.setActionCommand("Cancel");
				buttonPane.add(btnFormCadastro);
			}
			{
				JButton btnCancelar = new JButton("");
				btnCancelar.setToolTipText("<html><i>Cancelar opera\u00E7\u00E3o</i></html>");
				btnCancelar.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btCancelar.png")));
				btnCancelar.setActionCommand("Cancel");
				buttonPane.add(btnCancelar);
			}
			{
				JButton btnAtualisar = new JButton("");
				btnAtualisar.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						listarPiquetes("");
					}
				});
				btnAtualisar.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btAtualiza.png")));
				btnAtualisar.setToolTipText("<html><i>Cancelar opera\u00E7\u00E3o</i></html>");
				btnAtualisar.setActionCommand("Cancel");
				buttonPane.add(btnAtualisar);
			}
			{
				JButton btnExcluir = new JButton("");
				btnExcluir.setToolTipText("<html><i>Deletar item selecionado</i></html>");
				btnExcluir.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btExcluir.gif")));
				btnExcluir.setActionCommand("Cancel");
				buttonPane.add(btnExcluir);
			}
		}
	}
	
	private JTable getTblPiquetes() {
		if (tblPiquetes == null) {
			tblPiquetes = new JTable();
			tblPiquetes.setModel(new Bov_piquete_TableModel());
			tblPiquetes.setAutoResizeMode(tblPiquetes.AUTO_RESIZE_OFF);		
			tblPiquetes.getColumnModel().getColumn(0).setPreferredWidth(250);
			tblPiquetes.getColumnModel().getColumn(1).setPreferredWidth(100);
			tblPiquetes.getColumnModel().getColumn(2).setPreferredWidth(100);
			tblPiquetes.getColumnModel().getColumn(3).setPreferredWidth(100);
			tblPiquetes.getColumnModel().getColumn(4).setPreferredWidth(150);
			
			
		}
		return tblPiquetes;
	}
	private Bov_piquete_TableModel getModel() {
		if (model == null) {
			model = (Bov_piquete_TableModel) getTblPiquetes().getModel();
		}
		return model;
	}
	
	private List<Bov_piquete> getPiquetes(String nome) {
		List<Bov_piquete> piquetes = new ArrayList<Bov_piquete>();
		try {
			piquetes = dao.listarTodosPiquetes(nome);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return piquetes;
	}
	
	private void listarPiquetes(String descricao) {
		List<Bov_piquete> piquetes = new ArrayList<Bov_piquete>();
		try {
			piquetes = dao.listarTodosPiquetes(descricao);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		getModel().limpar();
		getModel().addListaDeUfs(piquetes);
	}
	
	public void atualizar(){
		Bov_piquete bv = new Bov_piquete();
		model.notifyUpdated(bv);
		System.out.print(bv.getNome());
	}
	
	
	
}

se poderem me ajudar fico grato amigos

implemente seu método:

[code] public void setValueAt(Object value, int row, int col){

} [/code]