1

I am building a desktop app using javafx, I am downloading a file around 500 MB using ftp. I need to show the progress bar with % while downloading is in progress. I also need to give a option to cancel a ongoing downloading process. I want the progress bar when the download button is clicked and it show the download progress and if I cancel downloading should stop.

This is my code to download file.

                    downloadButton.setOnMouseClicked(new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {
            // TODO Auto-generated method stub

            FTPClient ftpClient = new FTPConnection().makeConnection();

            try {
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                success = ftpClient.changeWorkingDirectory(PATH + preset + "/" + file_to_download + offset);
                System.out.println("Download Path:-" + PATH + preset + "/" + file_to_download + offset);
                if (!success) {
                    System.out.println("Could not changed the directory to RIBS");
                    return;
                } else {
                    System.out.println("Directory changed to RIBS");
                }
                FTPFile[] files = ftpClient.listFiles();
                for (FTPFile file : files) {
                    if (file.getName().contains(".zip")) {
                        dfile = file.getName();
                    }

                }

                DirectoryChooser dirChooser = new DirectoryChooser();
                primaryStage = (Stage) tableView.getScene().getWindow();
                primaryStage.setTitle("Background Processes");
                File chosenDir = dirChooser.showDialog(primaryStage);
                System.out.println(chosenDir.getAbsolutePath());

                Task task = new Task<Void>() {
                    @Override
                    public Void call() throws IOException {
                        try {
                            output = new FileOutputStream(chosenDir.getAbsolutePath() + "/" + dfile);
                        } catch (FileNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        ftpClient.sendNoOp();
                        ftpClient.setConnectTimeout(1000);

                        int filesize = 0;
                        if (ftpClient.retrieveFile(dfile, output) == true) {
                            downloadButton.setDisable(true);
                            dfile.length();
                            System.out.println("FILE:LENGTH" + dfile.length());
                        }

                        // updateProgress(outByte, inputByte);

                        return null;
                    }
                };
                                    final Stage dialog = new Stage();
                dialog.initModality(Modality.WINDOW_MODAL);
                dialog.initOwner(primaryStage);
                final ProgressBar progressBar = new ProgressBar(0);

                final Button cancelButton = new Button("Cancel");
                cancelButton.setOnAction(new EventHandler<ActionEvent>() {
                    public void handle(ActionEvent event) {
                        copyWorker.cancel(true);
                        progressBar.progressProperty().unbind();
                        progressBar.setProgress(0);
                        System.out.println("cancelled.");
                        dialog.close();
                    }
                });
                final Button closeButton = new Button("Close");
                closeButton.setOnAction(new EventHandler<ActionEvent>() {
                    public void handle(ActionEvent event) {
                        progressBar.progressProperty().unbind();
                        progressBar.setProgress(0);
                        dialog.close();
                    }
                });

                cancelButton.setDisable(false);
                closeButton.setDisable(true);

                VBox dialogVbox = new VBox();
                VBox.setMargin(progressBar, new Insets(10, 10, 10, 10));
                VBox.setMargin(cancelButton, new Insets(10, 10, 10, 10));
                dialogVbox.setAlignment(Pos.CENTER);
                HBox hBox = new HBox();
                hBox.setAlignment(Pos.CENTER);
                hBox.getChildren().addAll(cancelButton, closeButton);

                dialogVbox.getChildren().addAll(progressBar, hBox);

                Scene dialogScene = new Scene(dialogVbox, 160, 100);
                dialog.initStyle(StageStyle.UNDECORATED);
                dialog.setResizable(false);
                dialog.setScene(dialogScene);
                dialog.setOnShown(e -> {

                    progressBar.setProgress(0);
                    copyWorker = createWorker();

                    progressBar.progressProperty().unbind();
                    progressBar.progressProperty().bind(copyWorker.progressProperty());

                    copyWorker.messageProperty().addListener(new ChangeListener<String>() {
                        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                            System.out.println(newValue);

                        }
                    });

                    // TODO: handle succeeded & failed depending on your needs
                    EventHandler doneHandler = new EventHandler() {

                        @Override
                        public void handle(Event event) {

                            cancelButton.setDisable(true);
                            closeButton.setDisable(false);

                        }

                    };
                    copyWorker.setOnSucceeded(doneHandler);
                    copyWorker.setOnFailed(doneHandler);

                    new Thread(copyWorker).start();

                });
                dialog.show();
                // end
                new Thread(task).start();

                if (output != null) {
                    output.close();
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    });

In reference to my question How to show a progress bar while downloading in javafx I have moved my download code into a different background thread but I am not able to figure out how to display the progress bar.

Community
  • 1
  • 1
user3649361
  • 944
  • 4
  • 20
  • 40

1 Answers1

2

The example code already provided you a progress bar. It's just like any other node. You can put it wherevery you want. Here's an example about putting it into a dialog:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

// source: http://www.java2s.com/Code/Java/JavaFX/ProgressBarandBackgroundProcesses.htm
// http://stackoverflow.com/questions/22166610/how-to-create-a-popup-windows-in-javafx
public class ProgressTask extends Application {
    Task copyWorker;

    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        primaryStage.setTitle("Background Processes");
        Group root = new Group();
        Scene scene = new Scene(root, 330, 120, Color.WHITE);

        BorderPane mainPane = new BorderPane();
        root.getChildren().add(mainPane);

        final Label label = new Label("Files Transfer:");

        final HBox hb = new HBox();
        hb.setSpacing(5);
        hb.setAlignment(Pos.CENTER);
        hb.getChildren().addAll(label);
        mainPane.setTop(hb);

        final Button startButton = new Button("Start");
        startButton.setText("Start");
        startButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {

                final Stage dialog = new Stage();
                dialog.initModality(Modality.WINDOW_MODAL);
                dialog.initOwner(primaryStage);
                final ProgressBar progressBar = new ProgressBar(0);

                final Button cancelButton = new Button("Cancel");
                cancelButton.setOnAction(new EventHandler<ActionEvent>() {
                    public void handle(ActionEvent event) {
                        copyWorker.cancel(true);
                        progressBar.progressProperty().unbind();
                        progressBar.setProgress(0);
                        System.out.println("cancelled.");
                        dialog.close();
                    }
                });
                final Button closeButton = new Button("Close");
                closeButton.setOnAction(new EventHandler<ActionEvent>() {
                    public void handle(ActionEvent event) {
                        progressBar.progressProperty().unbind();
                        progressBar.setProgress(0);
                        dialog.close();
                    }
                });

                cancelButton.setDisable(false);
                closeButton.setDisable(true);

                VBox dialogVbox = new VBox();
                VBox.setMargin(progressBar, new Insets(10, 10, 10, 10));
                VBox.setMargin(cancelButton, new Insets(10, 10, 10, 10));
                dialogVbox.setAlignment(Pos.CENTER);
                HBox hBox = new HBox();
                hBox.setAlignment(Pos.CENTER);
                hBox.getChildren().addAll(cancelButton, closeButton);

                dialogVbox.getChildren().addAll(progressBar, hBox);

                Scene dialogScene = new Scene(dialogVbox, 160, 100);
                dialog.initStyle(StageStyle.UNDECORATED);
                dialog.setResizable(false);
                dialog.setScene(dialogScene);
                dialog.setOnShown(e -> {

                    progressBar.setProgress(0);
                    copyWorker = createWorker();

                    progressBar.progressProperty().unbind();
                    progressBar.progressProperty().bind(copyWorker.progressProperty());

                    copyWorker.messageProperty().addListener(new ChangeListener<String>() {
                        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                            System.out.println(newValue);

                        }
                    });

                    // TODO: handle succeeded & failed depending on your needs
                    EventHandler doneHandler = new EventHandler() {

                        @Override
                        public void handle(Event event) {

                            cancelButton.setDisable(true);
                            closeButton.setDisable(false);

                        }

                    };
                    copyWorker.setOnSucceeded(doneHandler);
                    copyWorker.setOnFailed(doneHandler);

                    new Thread(copyWorker).start();

                });
                dialog.show();

            }
        });

        final HBox hb2 = new HBox();
        hb2.setSpacing(5);
        hb2.setAlignment(Pos.CENTER);
        hb2.getChildren().addAll(startButton);
        mainPane.setBottom(hb2);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public Task createWorker() {
        return new Task() {
            @Override
            protected Object call() throws Exception {
                for (int i = 0; i < 10; i++) {
                    Thread.sleep(1000);
                    updateMessage(((i + 1) * 1000) + " milliseconds");
                    updateProgress(i + 1, 10);
                }
                return true;
            }
        };
    }
}
Roland
  • 18,114
  • 12
  • 62
  • 93
  • Hi @Ronald I have edited my code according to the example but I am not able to figure out one thing. I want the progress bar when the download button is clicked and it show the download progress how can I achieve this. – user3649361 Feb 15 '16 at 09:19
  • If you want help, please create a [MCVE](http://stackoverflow.com/help/mcve). That code isn't complete nor is it minimal, i. e. I don't have access to the ftp server. – Roland Feb 15 '16 at 11:36
  • I can't share the server details. I just need an Idea of how to include the progress bar in my scenario and how to make progress it with downloading. How to control cancel the downloading thread with it. – user3649361 Feb 15 '16 at 19:23