Como fazer uma Progress Bar enquanto há a execução do Download?

Uma dúvida no JavaFX, que procurei em vários lugares e não achei uma resposta, suponhamos que fiz um botão para fazer o download de um arquivo, só que quero que mostre uma ProgressBar, que mostre o progresso desse Download, como eu faria para a ProgressBar pegar o progresso do Download ?

Bem… meio que não entendi.
O que estou precisando apenas é que a ProgressBar mostre o Progresso do Download quando executar esse método:

public void instalarJogo() throws IOException{
fundo.setEffect(new GaussianBlur());

    URL urlneed = new URL("http://download1075.mediafire.com/2shateys88cg/fqgo71l6v4kzm4a/Underground+2.zip");
    String basePath = new File("").getAbsolutePath();

    File file = new File(new File("gamesFiles/underground2/Underground2.zip").getAbsolutePath());

    FileUtils.copyURLToFile(urlneed, file);

    
    Alert download = new Alert(Alert.AlertType.INFORMATION);
    download.initStyle(StageStyle.UNIFIED);
    download.setTitle("Download");
    download.setHeaderText("Download Iniciado");
    download.setContentText("Aguarde enquanto o jogo é baixado");
    download.showAndWait();

    fundo.setEffect(null);
}

Vc viu o link pelo menos? Fala exatamente disso. Totalmente explicado ainda.

Link que o cara da resposta correta CITA no tópico:
http://www.java2s.com/Code/Java/JavaFX/ProgressBarandBackgroundProcesses.htm

Fiz o que foi pedido lá, meu programa crasha ao clicar no Botão de Instalar.

package sample.ui;

import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.scene.effect.GaussianBlur;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.StageStyle;
import org.apache.commons.io.FileUtils;

import java.io.File;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class controllerDashboard implements Initializable {

@FXML
private ImageView fundo;

@FXML
private Button instalar;

@FXML
private Button fechar;

@FXML
private ProgressBar progressoDownload;
@FXML
public void initialize() {


    String img = getClass().getResource("images/ug1.png").toExternalForm();
    fundo.setImage(new Image(img));

    String cam = this.getClass().getResource("css/interface.css").toExternalForm();
    fundo.getStyleClass().add(cam);
    instalar.getStylesheets().add(cam);
    progressoDownload.setVisible(true);
    progressoDownload.setStyle("-fx-accent:#cc2a49");

}

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {

}
public void instalarJogo() throws IOException{
    Task baixar;
    fundo.setEffect(new GaussianBlur());
    progressoDownload.setVisible(true);
    progressoDownload.setProgress(0);
    baixar = createWorker();

    URL urlneed = new URL("http://download1075.mediafire.com/2shateys88cg/fqgo71l6v4kzm4a/Underground+2.zip");
    String basePath = new File("").getAbsolutePath();

    File file = new File(new File("gamesFiles/underground2/Underground2.zip").getAbsolutePath());

    FileUtils.copyURLToFile(urlneed, file);

    progressoDownload.progressProperty().unbind();

    progressoDownload.progressProperty().bind(baixar.progressProperty());
    new Thread(baixar).start();

    Alert download = new Alert(Alert.AlertType.INFORMATION);
    download.initStyle(StageStyle.UNIFIED);
    download.setTitle("Download");
    download.setHeaderText("Download Iniciado");
    download.setContentText("Aguarde enquanto o jogo é baixado");
    download.showAndWait();



    fundo.setEffect(null);
}

public void passarMouse(){
    instalar.setStyle("-fx-background-color: #1a5ab0");

}
public void saidaMouse(){
    instalar.setStyle("-fx-background-color: #338AFF");


}
public void fecharPassarMouse(){
    fechar.setStyle("-fx-background-color: #cc2a49");

}
public void fecharSaidaMouse(){
    fechar.setStyle("-fx-background-color: transparent");

}
public void encerrar(){
    System.exit(0);
}
public Task createWorker(){
    return new Task(){
        @Override
        protected Object call() throws Exception {
            for(int i =0; i<10;i++){
                Thread.sleep(2000);
                updateProgress(i + 1, 10);
            }
            return true;
        }
    };
}
}

Qual erro apresenta?

Não apresenta erro, o programa congela e aparece aquela mensagem que não está respondendo.

Vc fez a Thread? Se não fez, vai ficar congelado até o término do download. Nesse mesmo link tem um exemplo de uso.

public Task createWorker() {
        return new Task() {
            @Override
            protected Object call() throws Exception {
                for (int i = 0; i < 10; i++) {
                    Thread.sleep(2000);
                    updateMessage("2000 milliseconds");
                    updateProgress(i + 1, 10);
                }
                return true;
            }
        };

Eu havia colocado a Thread no local errado, tentei agora e funcionou. Muito obrigado pela ajuda.