2017-03-01 14 views
0

インターネットからファイルをダウンロードして(バックグラウンドサービスで)、ポップアップ段階でダウンロードの進捗状況を示すためのコードを書いています。コードは正常にコンパイルされ、実行時エラーはありません。ただし、ダウンロードは行われず、進行状況インジケータは不確定のままです。進捗インジケータが不確定のままで、ダウンロードがありません

コードは私のポイントを説明するために調整されています。それを見て、私がどこに間違って行ったのかを理解させてください。

ありがとうございます!

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

例外があった場合、それについてはわかりません。 onFailedハンドラをタスクに登録します: 'downloadTask.setOnFailed(e - > downloadTask.getException()。printStackTrace());'。進捗状況を変更するには、['updateProgress(...) '(http://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html#updateProgress)を呼び出す必要があります。 -long-long-)を 'call()'メソッドから削除します。 –

答えて

1

ライン:

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

...は、(コールバックまたはその進行の他の兆候はありません)あなたのダウンロードの進捗状況についての情報を提供していません。フィードバックを送らずに何かをダウンロードするだけです。

あなたは進捗状況についてフィードバックを得るために何か他のものを使用しなければなりません。

は、(それがスイングのためですが、JavaFXのためにそれらを適合させることができるはず)フィードバックと解決策については、この質問の答えを見てみましょう:Java getting download progress

+0

あなたのリンクを見ました。コードをJavaFXに適合させる方法を理解する必要があります。コードはJava.ioを使用しますが、org.apache.commons.ioを使用します。これは使用する方が簡単です。 –

0

あなたは「Taskへの進捗プロパティ」ProgressIndicatorをバインド後者の変化が前者に反映されます。しかし、は実際にはTaskの進捗状況を更新することはありません

進捗インジケータに何かが表示されるようにするには、タスク本体(または他の場所)にupdateProgress(workDone, max)を呼び出す必要があります。使用しているダウンロードロジックが進捗状況コールバックを提供していない場合、それは難しいかもしれません。 (おそらく、スレッドを生成してファイルシステム上のファイルのサイズを繰り返しチェックし、それをあなたの現在のworkDoneとして使用することができますが、ファイルの最終サイズ/完全サイズがどのようなものかを知る必要がありますこれはパーセンテージに変換されます)。

+0

私はupdateProgress()を使用して理解し、最終的なファイルサイズを見つけるのは難しい場合があります。だから私はもっと具体的な対応が必要なのです。すべてのブラウザがこの機能を実装しています。 –

関連する問題