Atualizar JLabel

Boa noite colegas,

sou novo no mundo do Java e estou tendo um problema para atualizar dados de um JLabel. Eu estou com um JFrame que é utilizado como interface para inserir dados ( por exemplo url do B.D., Usuário e senha do B.D.) para fazer um processo de ETL. Nesse JFrame tbm tenho um botão que irá criar um objeto de uma outra classe que realmente fará a extração dos dados. Quando o botão for clicado eu gostaria que um JLabel (lblStatus) que funciona como barra de status atualizasse com algumas informações sobre o andamento da extração, porém essa atualização está ocorrendo somente ao final da extraçãom, ou seja, a execução método setText que deveria atualizar o lblStatus no ínicio do método não me apresenta nada na tela. Gostaria de saber o que eu tenho que fazer para a instrução setText do JLabel execute antes da extração para dizer ao usuário que a extração começou. O código é apresentado abaixo:

[code]private void ButtonHandler(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ButtonHandler

    lblStatus.setText("Início do processamento");
    //lblStatus.paintAll(lblStatus.getGraphics());
    System.out.println ("Início do processamento");
    
    if (evt.getSource() == extrair)
    {
        try
        {
            ETLOlhoVivo ETL = new ETLOlhoVivo(txtUsuarioBD.getText(), pswSenhaBD.getText(), txtURLBD.getText(), txtDiaInicial.getText(), txtDiaFinal.getText());
            ETL.extracao();
            ETL.deteccao();
            lblStatus.setText("Detecção concluída com sucesso");

            //System.out.println(ETL.getUsuario() + " " + ETL.getSenha() + " " + ETL.getURLBD() + " " + ETL.getDataInicial() + " " + ETL.getDataFinal());
        }//try
        catch (Exception e)
        {
            lblStatus.setText("Problemas na extração");
            e.printStackTrace();
        }//catch
    }     
}//GEN-LAST:event_ButtonHandler[/code]

Valeu!!!

cara vc ja tentou colocar isso logo apos a criação do objeto

ETLOlhoVivo ETL = new ETLOlhoVivo(txtUsuarioBD.getText(), pswSenhaBD.getText(), txtURLBD.getText(), txtDiaInicial.getText(), txtDiaFinal.getText());
                 lblStatus.setText("Detecção concluída com sucesso");
                 ETL.extracao();
                 ETL.deteccao();
                 

Oi Fabiel,

eu já tentei isso, porém sem sucesso. Será que eu poderia fazer alguma outra coisa? Por favor me ajudem. Agradeço desde já se vcs me ajudarem.

Rafael,

Você precisa entender um pouquinho mais de Swing e threads para fazer isso. Todos os eventos do Swing são tratados em uma única thread, a EventDispatchThread, vulga EDT. Essa thread é que faria a atualização do JLabel, mas ela está ocupada com o seu processo ETL.

Você precisa executar o ETL em uma outra thread e atualizar o JLabel na thread do Swing. Algo como:

if (evt.getSource() == extrair) {
   new Thread() {
      public void run() {     
         try {
            ETLOlhoVivo ETL = new ETLOlhoVivo(txtUsuarioBD.getText(), pswSenhaBD.getText(), txtURLBD.getText(), txtDiaInicial.getText(), txtDiaFinal.getText());
            ETL.extracao();
            ETL.deteccao();

            EventQueue.invokeLater(new Runnable() {
               public void run() {
                  lblStatus.setText("Detecção concluída com sucesso");
               }
            });
          } catch (Exception e) {
            EventQueue.invokeLater(new Runnable() {
               public void run() {
                 lblStatus.setText("Problemas na extração");
               }
            });
            e.printStackTrace();
         }
      }
   }.start();
}     

Bom dia Michael,

Obrigado!!! Valeu mesmo, funcionou. Eu havia tentado colocar só as rotinas de ETL numa thread separada, mas não deu certo pq a thread da minha classe Main rodava (que roda na EDT) junto com a nova thread que estava rodando e a atualização acontecia tão rápido que sempre aparecia “Detecção concluída com sucesso”. Eu sei que nunca que eu ia saber tão rápido que eu tinha que criar uma nova thread dentro da própria thread da minha classe Main. Vou dar uma estudada nesses assuntos que eu meio que deixei de lado, por achar não muito necessários. Mais uma vez obrigado!!!