インターネットからファイルをダウンロードして(バックグラウンドサービスで)、ポップアップ段階でダウンロードの進捗状況を示すためのコードを書いています。コードは正常にコンパイルされ、実行時エラーはありません。ただし、ダウンロードは行われず、進行状況インジケータは不確定のままです。進捗インジケータが不確定のままで、ダウンロードがありません
コードは私のポイントを説明するために調整されています。それを見て、私がどこに間違って行ったのかを理解させてください。
ありがとうございます!
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);
}}
例外があった場合、それについてはわかりません。 onFailedハンドラをタスクに登録します: 'downloadTask.setOnFailed(e - > downloadTask.getException()。printStackTrace());'。進捗状況を変更するには、['updateProgress(...) '(http://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html#updateProgress)を呼び出す必要があります。 -long-long-)を 'call()'メソッドから削除します。 –