[AJUDA] Programa para enquanto faz outra coisa. [RESOLVIDO]

Gente, tô com o seguinte problema…
Estou desenvolvendo um sistema de controle escolar, e o programa está funcionando direitinho até agora.

Só que estou enfentando um problema com a impressora e o envio de emails.

Quando eu chamo a impressora, e atribuo os trabalhos que devem ser impressos e tudo mais e peço pra ela imprimir, o programa para tudo, gera os documentos e manda para impressão, só então ele volta.
A mesma coisa com o serviço de email. Quando está tudo pronto, mensagem digitada e assinada que faço a a chamada para a classe que faz a conexão com o servidor e envia a mensagem, ele para o programa para fazer tal chamada, conexão e envio. Só volta quando a mensagem está enviada.

Me ajudem, preciso dar um jeito de ao chamar um método tal, sem que o fluxo seja interrompido até que esse método seja completamente executado.
Meu cliente não pode ficar esperando o email que escreveu ser enviado para continuar a usar o programa ou os documentos que pediu para impressão serem gerados e enviados a impressora.

Abaixo o exemplo do email:

[code]private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
es = new util.EmailSender();

try {
    jLabel3.setText("Enviando email");
    es.sendMail("email destinatario", "Assunto qualquer", jTextArea1.getText().trim());
    jLabel3.setText("Enviado com sucesso!");

    } catch (Exception ex) {

        if (numDeTentativas <= 3)  {
            numDeTentativas++;
            jLabel3.setText("Não foi possível enviar a mensagem!");
            jButton1.setText("Tentar Novamente");
        }

    }
}

}[/code]

Neste exemplo. Ao clicar no Botão nomeado "Enviar". O Botão fica clicado até que o email seja enviado e a mensagem no jLabel3 seja setada para "Enviado com sucesso!"

Alguém me dá uma luz?
Desde já, agradeço.

Postei um exemplo de como eu uso e funciona 100%, espero que lhe ajude.

ERP

//Aqui é o evento de qdo clica no botão de um projeto meu, ao usar SwingWorker o mesmo executa seu comando e deixa a aplicação livre 
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        SwingWorker worker = new SwingWorker<String,Void>() {
            public String doInBackground() {
                try {
                    Executar();//Aqui vc chama seu metodo a ser executado
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
            public void done() {
                //sairSistema(); //Aqui você pode chamar algo ao finalizar, no meu caso o mesmo sai do sistema.
            }
        };
        worker.execute();//Aqui ele executa o SwingWorker deixando sua aplicação livre para uso mesmo enquanto estiver processando
    }

Para a execução de tarefas demoradas vc terá que usar Threads. Assim sua aplicação não trava.
Com o SwingWorker vc conseguirá executar seu método sem que sua aplicação trave, mas dê uma estudada sobre Threads em java pra vc entender melhor como isso funciona.

Sério? Muito obrigado, amigo. Mesmo!
Vou já começar a dar uma olhada nisso. (y)

Deu tudo certo aqui.
Usei ambas as opções, e optei por ficar com o uso de Threads.
Muito obrigado. Me ajudaram muito!