pimenta:
A cada iteração reconstrua o JFrame/JPanel que o JTextField está…
Deve funcionar…
Não, isso também não funciona. 
Atualizar campos assim é mais difícil do que parece. O que acontece é que seu while roda na thread do Swing. Então, enquanto você atualiza os valores, não importa que comando você dê, o swing não irá repintar a tela. Se você der um comando para que ele repinte, esse comando também vai esperar até que você termine seu loop.
Você teria que disparar esse método em outra thread. Esse é um exemplo de como fazer isso:
Thread t = new Thread(new Runnable() {
public void setText(final JTextField txtField, final String text) {
EventQueue.invokeLater(new Runnable() {
public void run() {
txtField.setText(text);
}
});
}
public void run() {
try {
do{
reserva=v[c];
valorReal=reserva-decrementa;
Thread.sleep(2000);
if(valorReal<0) {
v[c]=0;
setText(text[c], " "+0);
}
else{
v[c]=valorReal;
setText(text[c], " "+valorReal);
}
}while(valorReal>0);
reserva=0;
}
catch (Exception e) {
JOptionPane.showMessageDialog(null, "Erro! Reinicie o software!");
}
}
}
).start();
Note que eu criei um método chamado setText. Isso porque, quando você está usando outra thread, não deve atualizar os componentes gráficos do Swing diretamente. É necessário usar a fila de eventos e pedir para que a thread do Swing faça isso. É para isso que serve o EventQueue.invokeLater. Ele “agenda” o Runnable para ser executado pela thread do Swing.
Outra coisa, sempre que postar código, use a tag code. Assim seu código fica formatado, como o meu ali em cima. 
Se você não sabe fazer isso, lê esse post aqui:
http://www.guj.com.br/posts/list/50115.java
Ele te ensina a usar esse e outros recursos do fórum. 