implementação 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]