我已经编写了一段代码,用于从互联网(后台服务)下载文件,并在弹出阶段显示下载进度。代码编译成功,没有运行时错误。但是没有下载并且进度指示器仍然不确定。
该代码专为说明我的观点而量身定制。请看一下,让我明白我哪里出错了。
谢谢!
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);
}}
答案 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;但是您需要知道文件的最终/完整大小是什么把它变成一个百分比,这可能是也可能不容易。)