Programa java com comportamento estranho

3 respostas
A

Colegas,

No código abaixo, a mensagem “Validando o arquivo. Por favor, aguarde.” somente é exibida no JTextArea após a execução do método validar() do objeto arquivo, apesar de o comando para exibição encontrar-se antes.
O que pode estar ocorrendo?
É alguma configuração a ser feita?

private void validarArquivo()
    {
        textArea.append( "\nValidando o arquivo. Por favor, aguarde.\n\n" );
        arquivo.validar();
        textArea.append( "\nArquivo validado.\n" );

    }

3 Respostas

Anime

Oi,

Não entendi, pra que serve esse metodo validarArquivo(), para mostrar as mensagens…

Você tem esse outro arquivo.validar(), é para validar? Por que não coloca as mensagens nele mesmo…

R

Na verdade você está “travando” a EDT (Event Dispatch Thread, ou thread de tratamento de eventos) do Swing. Você solicitou o primeiro append(), e o comando ficou enfileirado para atendimento posterior pelo Swing. Em seguida você solicitou o método validar(), que demorou a ser concluído, e enquanto isso o primeiro append() ficou pendente. Depois do validar(), chegou o segundo append(), que também ficou enfileirado. Depois que o método validarAquivo() se encerrou, os dois append()'s que ficaram enfileirados finalmente executaram, causando o efeito que você descreveu. Experimente o seguinte:

textArea.append( "\nValidando o arquivo. Por favor, aguarde.\n\n" );
// Enfileira o conteúdo do bloco run() para execução posterior.
// Dessa maneira, o método validarArquivo() vai se encerrar, permitindo a
// exibição da mensagem "aguarde", e logo depois da exibição da
// mensagem o bloco run() enfileirado será executado.
SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    arquivo.validar();  
    textArea.append( "\nArquivo validado.\n" );
  }});

Leitura recomendada:
http://download.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

A

Obrigado pela dica.
Mais tarde vou testar.

Criado 15 de maio de 2011
Ultima resposta 15 de mai. de 2011
Respostas 3
Participantes 3