进度指标仍然不确定,没有下载

时间:2017-03-01 16:27:58

标签: java javafx

我已经编写了一段代码,用于从互联网(后台服务)下载文件,并在弹出阶段显示下载进度。代码编译成功,没有运行时错误。但是没有下载并且进度指示器仍然不确定。

该代码专为说明我的观点而量身定制。请看一下,让我明白我哪里出错了。

谢谢!

public class ExampleService extends Application {
URL url;    
Stage stage;

public void start(Stage stage)
{
    this.stage = stage;
    stage.setTitle("Hello World!");
    stage.setScene(new Scene(new StackPane(addButton()), 400, 200));
    stage.show();
}

private Button addButton()
{
    Button downloadButton = new Button("Download");
    downloadButton.setOnAction(new EventHandler<ActionEvent>()
    {
        public void handle(ActionEvent e)
        {
           FileChooser fileSaver = new FileChooser();
            fileSaver.getExtensionFilters().add(new FileChooser.ExtensionFilter("PDF", "pdf"));                

            File file = fileSaver.showSaveDialog(stage);

            getDownloadService(file).start();               
        }
    });        
    return downloadButton;
}

private Service getDownloadService(File file)
{
   Service downloadService = new Service() 
   {
       protected Task createTask()
       {
           return doDownload(file);
       }
   };

   return downloadService;
}

private Task doDownload(File file)
{
    Task downloadTask = new Task<Void>()
    {
       protected Void call() throws Exception
        {
            url = new URL("http://www.daoudisamir.com/references/vs_ebooks/html5_css3.pdf");

            // I have used this url for this context only
            org.apache.commons.io.FileUtils.copyURLToFile(url, file); 

            return null;
        } 
    };
    showPopup(downloadTask);
    return downloadTask;
}

Popup showPopup(Task downloadTask)
{
    ProgressIndicator progressIndicator = new ProgressIndicator();
    progressIndicator.progressProperty().bind(downloadTask.progressProperty());

    Popup progressPop = new Popup();
    progressPop.getContent().add(progressIndicator);
    progressPop.show(stage);

    return progressPop;

    // I have left out function to remove popup for simplicity
}
public static void main(String[] args)
{
    launch(args);
}}

2 个答案:

答案 0 :(得分:1)

该行:

org.apache.commons.io.FileUtils.copyURLToFile(url, file);

...没有为您提供有关下载进度的任何信息(没有回调或其进展的任何其他指示)。它只是下载了一些东西而没有给你反馈。

您必须使用其他能为您提供进度反馈的内容。

请看一下这些问题的答案,以获得有反馈的解决方案(适用于Swing,但您应该能够针对JavaFX进行调整):Java getting download progress

答案 1 :(得分:0)

您将ProgressIndicator的进度属性绑定到Task的进度属性,以便后者的更改将反映在前者中。但是您实际上从未真正更新Task的进度

如果您希望进度指示器显示某些内容,则您必须在任务机构(或其他地方)内拨打updateProgress(workDone, max)。如果您使用的下载逻辑没有为您提供任何进度回调,那么这可能会很棘手。 (或许,您可以生成一个线程来重复检查文件系统上文件的大小,并将其用作当前的workDone;但是您需要知道文件的最终/完整大小是什么把它变成一个百分比,这可能是也可能不容易。)