2017-07-15 17 views
-1

このコードはプログレスバー用です。私はバックグラウンドプロセスのためにこのプログレスバーを使用していますが、問題はプログレスバーがバックグラウンドタスクが完了した後にしか見えないことです!JavaFxプログレスバー

public class ProgBar { 

    public void porgressBarTest(){ 
     ProgressBar progressBar = new ProgressBar(); 
     progressBar.setProgress(0); 
     progressBar.setMinWidth(400); 

     VBox updatePane = new VBox(); 
     updatePane.setPadding(new Insets(30)); 
     updatePane.setSpacing(5.0d); 
     updatePane.getChildren().addAll(progressBar); 

     Stage taskUpdateStage = new Stage(StageStyle.UTILITY); 
     taskUpdateStage.setScene(new Scene(updatePane)); 
     taskUpdateStage.show(); 

     Task<Void> task = new Task<Void>() { 
      public Void call() throws Exception { 
       int max = 200; 
       for (int i = 1; i <= max; i++) { 
        updateProgress(i, max); 
        Thread.sleep(100); 
       } 
       System.out.println("about to close"); 
       return null; 
      } 
     }; 
     progressBar.progressProperty().bind(task.progressProperty()); 
     new Thread(task).start(); 
    } 
} 

この方法ではプログレスバーを使用します。

public void exportFile(String fileFormat) throws EngineException { 

    String output = *************; 
    String reportDesignFilePath = ********************; 

    // Save Report In Particular Format 
    try { 
    EngineConfig configure = new EngineConfig(); 
    Platform.startup(configure); 
    IReportEngineFactory reportEngineFactory=(IReportEngineFactory) Platform.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY); 
    IReportEngine engine = reportEngineFactory.createReportEngine(configure); 
    engine.changeLogLevel(Level.WARNING); 
    IReportRunnable runnable = engine.openReportDesign(reportDesignFilePath); 
    IRunAndRenderTask task = engine.createRunAndRenderTask(runnable); 
    IRenderOption option = new PDFRenderOption(); 
    option.setOutputFormat(fileFormat); 
    option.setOutputFileName(output+fileFormat); 
    task.setRenderOption(option); 
    task.run(); 
    task.close(); 
    } 
    catch(Exception e) { e.printStackTrace(); } 
    // Open Created File 
    File file = new File(output+fileFormat); 
    if (file.exists()) { 
    if (Desktop.isDesktopSupported()) { 
     try { 
      Desktop desktop = Desktop.getDesktop(); 
      desktop.open(file); 
     } 
     catch(IOException e) { 
     e.printStackTrace(); 
     } 
    } 
    } 
} 
+0

あなたの答えをより具体的に説明してください。 – Demo

+0

このコードを実行し、アプリケーションがロードされたときにprogressBarが表示しました。おそらく、あなたのアプリケーションで動いている他のスレッドと何か関係があります。 – Nash

+0

してください、私はこのプログレスバーを望む方法を参照してください – Demo

答えて

0

progressBarの読み込みが完了した後で、exportFile()メソッドを呼び出そうとしていると思います。

コードは正常です。 progressBarがロードされた後にexportFile()メソッドを呼び出すには、以下に示すようにsetOnSuccededMethodを呼び出すことができます。

Task<Void> task = new Task<Void>() { 
      public Void call() throws Exception { 
       int max = 200; 
       for (int i = 1; i <= max; i++) { 
        updateProgress(i, max); 
        Thread.sleep(100); 
       } 
       System.out.println("about to close"); 
       return null; 
      } 
     }; 
     progressBar.progressProperty().bind(task.progressProperty()); 

     task.setOnSucceeded(e -> { 

      exportFile(); 

     }); 

     task.setOnFailed(e -> { 
      //more things 
     }); 
     new Thread(task).start(); 

このように、progressBarロードが完了すると、exportFile()関数が呼び出されます。 exportFile()メソッドでDesktopクラスを使用しているため、プログラムがハングすることがあります。 JAVAFXスレッドは、Desktopクラスと組み合わせると正しく動作しません。 JavaFXスレッドの種類がブロックされます。以下のように、エクスポートされたファイルを開くために新しいスレッドを作成する必要があります。

public void exportFile(String fileFormat) throws Exception{ 

//upper portion of Code 

     File fileToOpen = new File("LocationOfFile"); 
     if(Desktop.isDesktopSupported()) { 
      new Thread(() -> { 
       try { 
        Desktop.getDesktop().open(fileToOpen); 
        System.out.println("FileOpened Successfully"); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      }).start(); 
     } 


     System.out.println("exportFile finishing"); 
    } 

リンクされた質問:JavaFX thread issue