others, bom 2007 pra vc também!
vejamos, vc já resolveu a parte de pegar a linha e popular o formulário, correto? Pois bem, na minha aplicação quando eu termino de editar eu uso o model da tabela para atualizar; no meu caso eu implementei a interface TableModel e extendi de AbstractTableModel, que cuida da parte de ouvintes.
aí o que acontece: 1- seleciono um linha na tabela e peço o objeto em questão para a minha implementação de TableModel 2- após as modificações eu utilizo um método extra que eu inseri no model da minha tabela para fazer “update” 3- utilizo um método chamado fireTableDataChanged() que está presente em AbstractTableModel
acho que fui muito confuso, mas o segredo todo é chamar esse fireTableDataChanged; claro, é recomendável que você implemente o seu próprio model, pois, ao menos pra mim, ele é uma ligação perfeita entre o banco e a nossa tela.
Acho que já postei isto antes, mas aqui vai um exemplo de um dos Models que eu tenho utilizado… com ele as tarefas de select, create, update e delete ficam muito fáceis, e métodos de ordenação também são uma boa colocar no Model…
/*
* ProdutoTableModel.java
*
* Created on 18 de Dezembro de 2006, 23:44
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package visual.model;
import entidades.produtos.Produto;
import java.util.List;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import persistencia.Banco;
/**
*
* @author sombriks
*/
public class ProdutoTableModel extends AbstractTableModel implements TableModel{
private List<Produto>data;
private Banco banco;
/**
* Creates a new instance of ProdutoTableModel
*/
public ProdutoTableModel(Banco banco) {
this.banco=banco;
}
/**
* Através deste método que "subimos" um produto até a camada mais próxmia
*do end-user.
*/
public Produto getProdutoAt(int i) {
return data != null ? data.size() > i ? data.get(i) : null : null;
}
/**
* Este método nos permite popular com dados oriundos do banco o modelo, e
*dessa forma exibir através da tabela os dados ao cliente.
*/
public void select(Produto produto){
data = produto != null ?
banco.select(produto) : banco.select(Produto.class);
fireTableDataChanged();
}
/**
* Metodo de "criação" de produtos. Na realidade o produto já chega pronto
*aqui.
*/
public void create(Produto p) {
if(p!=null)
banco.set(p);
select(null);
}
/**
* Método utilizado para atualizar produtos
*/
public void update(Produto p) {
if(p!=null)
banco.set(p);
select(null);
}
/**
* Método prara deletar produtos
*/
public void delete(Produto p) {
if(p!=null)
banco.delete(p);
select(null);
}
/**
* Método exigido pela interface. devolvemos o tamanho do List privado, que
*é onde guardamos os valores recuperados do banco.
*/
public int getRowCount() {
//assert data != null : "Um problema ocorreu...";
return data != null ? data.size() : 0;
}
/**
* Método exigido pela interface. serve para devolver o número de colunas.
*/
public int getColumnCount() {
return 7;
}
/**
* Método sobrescrito da classe abstrata e exigido pela interface. aqui nós
*fornecemos os nomes das colunas.
*/
public String getColumnName(int columnIndex) {
switch(columnIndex){
case 0:
return "id";
case 1:
return "nome do produto";
case 2:
return "unidade de medida";
case 3:
return "quantidade em estoque";
case 4:
return "valor unitário";
case 5:
return "preco de compra";
case 6:
return "descrição";
default :
return "";
}
}
/**
* Método sobrecrito da classe abstrata e exigido pela interface; os dados
*não são editados na própria tabela, mas sim em um componente externo.
*/
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
/**
* Método exigido pela interface. aqui utiliamos uma switch para pegar os
*dados da lista e exibir um por vez de forma tratada.
*/
public Object getValueAt(int rowIndex, int columnIndex) {
switch(columnIndex){
case 0:
return data.get(rowIndex).getId();
case 1:
return data.get(rowIndex).getNome();
case 2:
return data.get(rowIndex).getUnidade();
case 3:
return data.get(rowIndex).getEstoque();
case 4:
return "R$ "+data.get(rowIndex).getValor();
case 5:
return "R$ "+data.get(rowIndex).getPrecoDeCompra();
case 6:
return data.get(rowIndex).getDescricao();
default :
return "";
}
}
}
espero ter descomplicado ao invés de complicar, 
boa sorte e qualquer dúvida continue o tópico.