[Ajuda] Threads em java

E ai galera blz?
Estou desenvolvendo um projeto em Java para fins de aprendizado, e me deparei com um pequeno problema. No meu projeto, existe um Frame que seria usado para enviar algum possível bug no programa, até ai tudo bem, já desenvolvi a parte que envia o email. Mas queria que enquanto o email estivese sendo enviado, fosse apresentada uma label com uma mensagem ex: Enviando mensagem Aguarde… e logo em seguida a mensagem da a label seria atualizada com outra mensagem ex: Mensagem enviada com Sucesso.. Assim o usuário não ficaria aguardando sem saber o que aconteceu.

Porém a label está sendo atualizada apenas após o envio do email, mais enquanto está sendo enviado não consigo setar uma mensagem para a label. O que está me deixando ainda com mas intrigado é que se dou um System.out.println o código roda certinho, e quando seto a mensagem para a label, parece apenas ignorar a linha do código.
Segue um print do meu Frame.

Segue o evento do botão enviar.

Segue o código do botão Enviar Email

private void jbt_EnviarEmailActionPerformed(java.awt.event.ActionEvent evt) {                                                
        try {
            jlb_teste.setText("Enviando Aguarde...");
            System.out.println("Enviando Aguarde...1");
            EnviarEmail();
        } catch (IOException ex) {
            Logger.getLogger(JD_EnviarEmail.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 

Segue o Método EnviarEmail.

private void EnviarEmail() throws IOException {

        System.out.println("COMEÇANDO A ENVIAR");
        jlb_teste.setText("Enviando Aguarde...2");
        System.out.println("Enviando Aguarde...2");
        
        try {
            jlb_teste.setText("Enviando Aguarde...3");
            System.out.println("Enviando Aguarde...3");
            MultiPartEmail emailss = new MultiPartEmail();
            emailss.setDebug(true);
            jlb_teste.setText("Enviando Aguarde...4");
            System.out.println("Enviando Aguarde...4");
            emailss.setHostName("smtp.gmail.com");
            emailss.setAuthentication("testeestoquex@gmail.com", "testeestoque");
            emailss.setSmtpPort(465);
            emailss.setSSL(true);
            emailss.addBcc("testeestoquex@gmail.com");
            emailss.addBcc(jtf_contato.getText());
            emailss.setFrom("testeestoquex@gmail.com", "EstoqueF"); 
            emailss.setSubject(jtf_assunto.getText());
            emailss.setMsg(jta_mensagem.getText() + "\n\nEmail para Contato: " + jtf_contato.getText());
            

            if (!attachment.getName().equals("")) {
                emailss.attach(attachment);  //anexo
            }
           emailss.send();
            
            jlb_teste.setText("Email enviado com sucesso.");//Apenas aqui ele seta a mensagem para a label
            System.out.println("Email enviado com sucesso.");
        } catch (EmailException e) {

            JOptionPane.showMessageDialog(null, "Impossivel enviar email, verifique sua conexão com a Internet e Tente novamente");
        }

    }

O nome da label onde estou tentando setar as mensagem é jlb_teste.

Fiz algumas pesquisas e acho que uma Thread resolveria meu problema.
Olhei alguns matérias sobre threads, aparentemente é algo simples, mas não consegui implementar em meu código. Se alguém poder me ajudar a resolver o problema, fico grato
OBS: não precisa ser necessariamente com Threads, citei esse exemplo, pois apos
minha pesquisa, acho que o problema se resolveria com ela.

Você deve usar o SwingWorker para estes casos:

Muito obrigado, vou dar uma estudada, e logo posto um feedback.

@rmendes08
Mano, muitoooooo obrigadooOOOO.
Você não tem ideia de quanto tempo estou atras disso, mas sempre procurando sobre threads. Com a sua dica deu certo.

Ainda estou tentando entender em detalhes como funciona. Mas já fiz uma gambiarra aqui e a principio deu certo.

Segue o o código abaixo. Só retirei alguns systems que tinha colocado pra testar, p deixar o código mais limpo. Se não for pedir de mais, veja se implementei o código corretamente ou ainda tenho que alterar algo. E muito obrigado novamente.
Evento do botão enviar email

private void jbt_EnviarEmailActionPerformed(java.awt.event.ActionEvent evt) {                                                
        try {
            //jlb_teste.setText("Enviando Email. Por favor aguarde ...");
            EnviarEmail();
        } catch (IOException ex) {
            Logger.getLogger(JD_EnviarEmail.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 

Método EnviarEmail

private void EnviarEmail() throws IOException {

            SwingWorker TesteWorker = new SwingWorker() {
            @Override
            protected Void doInBackground() throws Exception {
            
            jlb_teste.setText("Enviando Email. Por favor aguarde ...");
        try {
            MultiPartEmail emailss = new MultiPartEmail();
            emailss.setDebug(true);
            emailss.setHostName("smtp.gmail.com");
            emailss.setAuthentication("testeestoquex@gmail.com", "testeestoque");
            emailss.setSmtpPort(465);
            emailss.setSSL(true);
            emailss.addBcc("testeestoquex@gmail.com");
            emailss.addBcc(jtf_contato.getText());
            emailss.setFrom("testeestoquex@gmail.com", "EstoqueF"); 
            emailss.setSubject(jtf_assunto.getText());
            emailss.setMsg(jta_mensagem.getText() + "\n\nEmail para Contato: " + jtf_contato.getText());
            
            if (!attachment.getName().equals("")) {
                emailss.attach(attachment);  //anexo
            }
           emailss.send();
            
            jlb_teste.setText("Email enviado com sucesso.");
            
        } catch (EmailException e) {

            JOptionPane.showMessageDialog(null, "Impossivel enviar email, verifique sua conexão com a Internet e Tente novamente");
        }

A proposito, acabei de notar uma coisa que me deixou em dúvida rsrsr.
na linha onde seto a msg para a label jlb_teste.setText(“Enviando Email. Por favor aguarde …”);, percebi que posso deixar ele no evento do botão, no caso como eu fiz, comentei o do evento do botão, e deixei

Tem aí um detalhe importante. Toda a manipulação da GUI deve ser feita na thread EventDispatcher, ou seja nos eventos dos controles. O método doInBackground() deve ser usado somente para o processamento: cálculos, I/O, etc.

@rmendes08
Me desculpe amigo, mas não ficou bem claro para mim.
Da forma que eu mostrei acima resolveu o meu problema. está errado?

Teoricamente sim.

O que você deve fazer é o seguinte:

Mandar o e-mail no doBackground, e atualizar a gui no método(sobrescrita) done (jlb_teste.setText(“Email enviado com sucesso.”);.

https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html aqui tem um exemplo simples.

1 curtida