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();
}
}
}