Allora il concetto è questo se vuoi che l'utente una volta cliccato possa cmq fare altro con il programma, ti basta spostare la chiamata alla funzione "pesante" sul thread e una volta che tale funzione è finita puoi avvertire l'utente in qualche modo.
Per quanto riguarda la progress bar puoi dare un occhio al tutorial dell'oracle link