Preencher jTextArea ao clicar em um botão

2 respostas
DZR

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

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.

2 Respostas

R

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

Jovem,

Muito obrigado. Funcionou de boa aqui.

Criado 15 de dezembro de 2009
Ultima resposta 15 de dez. de 2009
Respostas 2
Participantes 2