Preencher jTextArea ao clicar em um botão

Senhores e senhoras, bom dia.

Estou criando uma tela para chamar uma requisição via Java RMI.
O funcionamento do Java RMI é tranquilo. E até criar a tela é mais tranquilo ainda.
O problema é que quando eu clico no botão de requisição, eu preciso preencher um jTextArea, informando que
o botão foi clicado. Mas ao mesmo tempo, preciso enviar uma requisição ao Java RMI.

Segue abaixo o código criado:

[code] private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

    jTextArea1.append("Requisição 1 solicitada\n");
    Serv1Interfaces serv1 = null;
    try {
        serv1 = (Serv1Interfaces) Naming.lookup("Solicitacao1");
    } catch (Exception e){System.out.print("Erro encontrado em serv1");}
    try {
        this.impressao = serv1.EnviaSolicitacao();
    } catch (Exception ex) {this.impressao = "Falha ao executar o pedido\n";}

    jTextArea1.append(this.impressao);
}                                        

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    jTextArea1.append("Requisição 2 solicitada\n");
    Serv1Interfaces serv2 = null;
    try{
        serv2 = (Serv1Interfaces) Naming.lookup("Solicitacao2");
    }catch(Exception e){}
    try{
        this.impressao = serv2.EnviaSolicitacao();
    }catch (Exception e){this.impressao = "Falha ao executar o pedido\n";}

    jTextArea1.append(this.impressao);
}                                        

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    jTextArea1.append("Requisição 3 solicitada\n");
    Serv1Interfaces serv3 = null;

    try{
        serv3 = (Serv1Interfaces) Naming.lookup("Solicitacao3");
    }catch (Exception e){}
    try{
        this.impressao = serv3.EnviaSolicitacao();
    }catch(Exception e){this.impressao = "Falha ao executar o pedido\n";}

    jTextArea1.append(this.impressao);
}                                        

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    jTextArea1.append("Requisição 4 solicitada\n");
    Serv1Interfaces serv4 = null;

    try{
        serv4 = (Serv1Interfaces) Naming.lookup("Solicitacao4");
    }catch (Exception e){}

    try{
        this.impressao = serv4.EnviaSolicitacao();
    }catch(Exception e){this.impressao = "Falha ao executar o pedido\n";}
    jTextArea1.append(this.impressao);
}                                        [/code]

Sei que eu não precisava criar, para cada botão, um objeto da interface Serv1Interfaces, mas fiz isso por
motivos organizacionais e didáticos.

Bom, o meu problema é que o preenchimento da jTextArea só ocorre depois que a action executa toda, o que não
me ajuda.

Dúvida: Como eu faço para o jTextArea seja preenchido assim que eu clicar no botão, sem esperar a ação toda do botão
acabar? Será que tenho que criar outra action só para chamar a requisição remota? Se for isso, qual action eu uso?

Desde já agradeço.

Dispare uma thread em separado quando o botão for clicado:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
  // Trecho executado na EDT (Event Dispatching Thread) do Swing
  jTextArea1.append("Requisição 1 solicitada\n");  

  // Cria (mas não inicia) uma thread separada para a execução RMI
  Thread thr = new Thread() {
    public void run() {
      Serv1Interfaces serv1 = null;  
      try {  
        serv1 = (Serv1Interfaces) Naming.lookup("Solicitacao1");  
      } catch (Exception e){System.out.print("Erro encontrado em serv1");}  
      try {  
        this.impressao = serv1.EnviaSolicitacao();  
      } catch (Exception ex) {this.impressao = "Falha ao executar o pedido\n";}  

      // Notifica a EDT
      final String finalImpressao = this.impressao;

      SwingUtilities.invokeLater(new Runnable() {  
        public void run() {  
          jTextArea1.append(finalImpressao);  
      }}); 
    }};

  // Inicia a thread
  thr.start();
}

Jovem,

Muito obrigado. Funcionou de boa aqui.