Atualizar instantaneamente JTextField

Pessoal, num tratamento de eventos mostro num JTextField o texto “SHUFFLING …” para dizer que tô processando, depois mostro outro texto dizendo que já está processado após executar uma chamada de método. O problema que o processamento é muito rápido e a mensagem de “SHUFFLING …” não aparece, ainda coloquei um método de uma classe minha que faz uma pausa de 5 segundos na execução ( Wait.manySec(5) ), mesmo assim não funciona pois as duas saídas de texto aparecem na tela apenas depois da pausa.

Como poderia proceder para atualizar a tela neste momento?

Trecho do código:
shuffleButton.addActionListener(

        // classe interna anônima
        new ActionListener() {

            // embaralha as cartas
            public void actionPerformed( ActionEvent e ) {

                displayField.setText( "SHUFFLING ..." );
                Wait.manySec( 5 );
                shuffle();
                displayField.setText( "DECK IS SHUFFLED" );
            }

        }   // fim da classe interna

    );  // fim da chamada para addActionListener

Código todo:
// Pacotes do núcleo de Java
import java.awt.;
import java.awt.event.
;

// Pacotes de extensão de Java
import javax.swing.*;

public class DeckOfCards extends JFrame {

private Card deck[];
private int currentCard;
private JButton dealButton, shuffleButton;
private JTextField displayField;
private JLabel statusLabel;

/** Creates a new instance of DeckOfCards */
public DeckOfCards() {
    
    super( "Card Dealing Program" );
    
    String faces[] = { "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven", "Eight",
                        "Nine", "Ten", "Jack", "Queen", "King" };
                        
    String suits[]= { "Hearts", "Diamonds", "Clubs", "Spades" };
    
    deck = new Card[ 520000 ];
    currentCard = -1;
    
    // preenche o baralho com objetos Card
    for ( int count = 0; count < deck.length; count++ )
        deck[ count ] = new Card( faces[ count % 13 ], suits[ count / 130000 ] );
    
    // configura a GUI e tratamento de eventos
    Container container = getContentPane();
    container.setLayout( new FlowLayout() );
    
    dealButton = new JButton( "Deal card" );
    dealButton.addActionListener(
        // classe interna anônima
        new ActionListener() {
            // distribui uma carta
            public void actionPerformed( ActionEvent e ) {
                Card dealt = dealCard();
                
                if ( dealt != null ) {
                    displayField.setText( dealt.toString() );
                    statusLabel.setText( "Card #: " + currentCard );
                }
                else {
                    displayField.setText( "NO MORE CARDS TO DEAL" );
                    statusLabel.setText( "Shuffle cards to continue" );
                }
            }
        }   // fim da classe interna
    );  // fim da chamada para addActionListener
    
    container.add( dealButton );
    
    shuffleButton = new JButton( "Shuffle cards" );
    shuffleButton.addActionListener(
        // classe interna anônima
        new ActionListener() {
            // embaralha as cartas
            public void actionPerformed( ActionEvent e ) {
                displayField.setText( "SHUFFLING ..." );
                Wait.manySec( 5 );
                shuffle();
                displayField.setText( "DECK IS SHUFFLED" );
            }
        }   // fim da classe interna
    );  // fim da chamada para addActionListener
    
    container.add( shuffleButton );
    
    displayField = new JTextField( 20 );
    displayField.setEditable( false );
    container.add( displayField );
    
    statusLabel = new JLabel();
    container.add( statusLabel );

    // configura o tamanho e mostra a janela
    setSize( 275, 120 );
    show();
}

// embaralha as cartas com algoritmo de uma só passagem
public void shuffle() {
    
    currentCard = -1;
    
    // para cada carta, escolhe aleatoriamente outra carta e as troca
    for ( int first = 0; first < deck.length; first++ ) {
        int second = (int) ( Math.random() * 520000 );
        Card temp = deck[ first ];
        deck[ first ] = deck[ second ];
        deck[ second ] = temp;
    }
    
    dealButton.setEnabled( true );
}

// distribui uma carta
public Card dealCard() {
    
    if ( ++currentCard < deck.length )
        return deck[ currentCard ];
    else {
        dealButton.setEnabled( false );
        return null;
    }
        
}


public static void main(String[] args) {
    
    DeckOfCards app = new DeckOfCards();
    
    app.addWindowListener(
        // classe interna anônima
        new WindowAdapter() {
            // termina o aplicativo quando o usuário fecha a janela
            public void windowClosing( WindowEvent e ) {
                System.exit(0);
            }
        }   // fim da classe interna
    );  // fim da chamada para addWindowListener
}

} // fim da classe DeckOfCards

// classe que representa uma carta
class Card {
private String face;
private String suit;

// Construtor
public Card( String cardFace, String cardSuit ) {
    face = cardFace;
    suit = cardSuit;
}

public String toString() {
    return face + " of " + suit;
}

}

// classe para efetuar uma pausa
class Wait {
public static void oneSec() {
try {
Thread.currentThread().sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void manySec(long s) {
try {
Thread.currentThread().sleep(s * 1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}

OI

rrrodas, após o setText no JTextField faça uma chamada ao método show()

T+

[quote=“jeveaux”]OI

rrrodas, após o setText no JTextField faça uma chamada ao método show()

T+[/quote]

Olá jeveaux,

já havia tentado sua dica, mas não deu certo. É como se houvesse um gerenciador de telas que otimizasse a atualização.

Usei também hide(); show(); depois do setText, o hide() funciona, mas o show() funciona apenas depois do meu atraso forçado já atualizando o texto do JTextField todo de uma vez.

Muito obrigado pela ajuda.