Implementaçao da tela de Ajuste de Estoque (TableModel)

Boa tarde caro colegas será q alguem pode me da uma força na implementação de uma TableModel para a tela de ajuste de estoque ja estou jogados os dados na jtable e fazendo os calculos, só q gostaria de modificar algumas coisa, tipo ao lista o itens na jtable a coluna diferença e total esta trazendo os valores só queria q ele esse valores aparecia apos a digitação da coluna ajuste, e apos precionar o enter o foco ir para a proxima linha de preferencia na mesma coluna. abaixo ou deixar o codigo de table model e o link da imagem da minha tela.

http://img716.imageshack.us/img716/7388/ajustedeestoque.gif

[code]public class TableModelAjusteEstoque extends AbstractTableModel {

private static final DecimalFormat dF = new DecimalFormat("#,##0.00");   
private List<Produto> linhas;   
Produto prod;   
private String[] colunas = new String[]{   
    "Código", "Descrição", "Custo Médio", "Quantidade", "Ajuste", "Diferença", "Total"};   

public TableModelAjusteEstoque() {   
    linhas = new ArrayList<>();   
}   

public TableModelAjusteEstoque(List<Produto> listaDeProdutos) {   
    linhas = new ArrayList<>(listaDeProdutos);   
}   

@Override   
public int getColumnCount() {   
    return colunas.length;   
}   

@Override   
public int getRowCount() {   
    return linhas.size();   
}   

@Override   
public String getColumnName(int columnIndex) {   
    return colunas[columnIndex];   
}   

@Override   
public Class<?> getColumnClass(int columnIndex) {   
    switch (columnIndex) {   
        case 0:   
            return int.class;   
        case 1:   
            return String.class;   
        case 2:   
            return double.class;   
        case 3:   
            return double.class;   
        case 4:   
            return String.class;   
        case 5:   
            return double.class;   
        case 6:   
            return double.class;   
        default:   
            throw new IndexOutOfBoundsException("columnIndex out of bounds");   
    }   
}   

@Override   
public Object getValueAt(int rowIndex, int columnIndex) {   
    prod = linhas.get(rowIndex);   
    switch (columnIndex) {   
        case 0:   
            return prod.getId();   
        case 1:   
            return prod.getNome();   
        case 2:   
            return dF.format(prod.getVlr_cmv());   
        case 3:   
            return dF.format(prod.getQuantidade());   
        case 4:   
            return prod.getEst_atual();   
        case 5:   
            try {   
                return dF.format(prod.getEst_atual()-Ulti.formatarValor(prod.getQtde()) );   
            } catch (ParseException ex) {   
                Logger.getLogger(TableModelAjusteEstoque.class.getName()).log(Level.SEVERE, null, ex);   
            }   
        case 6:   
            try {   
                return dF.format(( prod.getEst_atual()-Ulti.formatarValor(prod.getQtde())) * prod.getVlr_cmv());   
            } catch (ParseException ex) {   
                Logger.getLogger(TableModelAjusteEstoque.class.getName()).log(Level.SEVERE, null, ex);   
            }   
        default:   
            throw new IndexOutOfBoundsException("columnIndex out of bounds");   
    }   
}   

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {   
    Produto prod = linhas.get(rowIndex);   

    System.out.println("columnIndex: " + columnIndex);   

    switch (columnIndex) {   
        case 0:   
            if (aValue.getClass() == int.class) {   
                prod.setId(Integer.parseInt(aValue.toString()));   
            }   
            break;   
        case 1:   
            if (aValue.getClass() == String.class) {   
                prod.setNome(aValue.toString());   
            }   
            break;   
        case 2:   
            if (aValue.getClass() == Double.class) {   
                prod.setVlr_custo(Double.parseDouble(aValue.toString()));   
            }   
            break;   
        case 4:   
            try {   
                prod.setEst_atual(Integer.parseInt(aValue.toString()));   
            } catch (Exception e) {   
            }   
            break;   
        case 3:   
            if (aValue.getClass() == Double.class) {   
                prod.setQuant_inv(Double.parseDouble(aValue.toString()));   
            }   
            break;   
        default:   
            throw new IndexOutOfBoundsException("columnIndex out of bounds");   
    }   
}   

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

public Produto getProduto(int indiceLinha) {   
    return linhas.get(indiceLinha);   
}   

public void addProduto(Produto prod) {   
    linhas.add(prod);   
    int ultimoIndice = getRowCount() - 1;   
}   

public void removeProduto(int indiceLinha) {   
    linhas.remove(indiceLinha);   
    fireTableRowsDeleted(indiceLinha, indiceLinha);   
}   

public void addListaDeProduto(List<Produto> prod) {   
    int tamanhoAntigo = getRowCount();   
    linhas.addAll(prod);   
    fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);   
}   

public void limpar() {   
    linhas.clear();   
    fireTableDataChanged();   
}   

public boolean isEmpty() {   
    return linhas.isEmpty();   
}   

public double getTotalGeral() {   
    double total = 0;   
    for (Produto p : linhas) {   
        total += p.getVlr_cmv() * p.getEst_atual();   
    }   
    return total;   
}   

public List<Produto> getLinhas() {   
    return linhas;   
}  

[/code]