2016-08-16 68 views
0

我正在用javafx編寫一個程序,其中顯示不同的圖表。圖表值基於從數據庫收集的數據。由於我必須首先從數據庫收集數據,然後在代碼中進行進一步的計算,因此某些圖表需要一些時間才能加載。我想要一個進度指示器來顯示圖表加載的進度。在顯示圖表之前,用戶選擇他/她想要的圖表類型,然後單擊「開始」按鈕查看圖表。單擊該按鈕之前,進度指示器看起來像這樣和作品完美的罰款:在圖表加載時顯示進度javafx

Progress indicator

當用戶點擊「開始」按鈕,圖表開始加載,我想進度指示器,顯示加載進度百分比。問題是隻要圖表開始加載進度指示器就會凍結。我試圖對進度條(及其下面的文本)進行的所有更改都將在整個圖表完全加載之前完成,這種方式會破壞進度指示器的整個用途。

有沒有什麼辦法讓圖表加載時進度指示器發生變化?

謝謝!

+1

您是否使用做後臺任務在不同的線程? – ItachiUchiha

回答

1

Task不同Thread爲此,更新的進度和進展屬性綁定到Task的進展:

@Override 
public void start(Stage primaryStage) { 
    ProgressIndicator progressIndicator = new ProgressIndicator(); 
    Button btn = new Button("Go"); 
    VBox root = new VBox(10, btn, progressIndicator); 

    btn.setOnAction((ActionEvent event) -> { 
     Task<LineChart> task = new Task<LineChart>() { 

      @Override 
      protected LineChart call() throws Exception { 
       for (int i = 0; i < 10; i++) { 
        try { 
         // do some work 
         Thread.sleep(500); 
        } catch (InterruptedException ex) { 
        } 
        updateProgress(10 * i, 100); 
       } 
       updateProgress(100, 100); 

       return new LineChart(new NumberAxis(), new NumberAxis()); 
      } 

     }; 
     progressIndicator.progressProperty().bind(task.progressProperty()); 
     task.setOnSucceeded(evt -> { 
      // handle successful completion of task on application thread 
      root.getChildren().set(root.getChildren().indexOf(progressIndicator), task.getValue()); 
     }); 
     new Thread(task).start(); 
    }); 

    Scene scene = new Scene(root, 300, 300); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

謝謝你的回答!一個問題:我有不同的方法來創建不同的圖表。當點擊「開始」按鈕時,程序會檢查用戶選擇的圖表,然後調用創建該圖表的方法。例如,如果用戶選擇了氣泡圖,則會調用createBubbleChart()方法。在代碼示例中,我可以在哪裏調用這些不同的方法來獲取與圖表加載相關的進度? – ekstroom

+0

@ekstroom你最好的選擇似乎是使用策略或工廠模式(工廠將創建「任務」創建圖表)。策略或工廠都可以用作ComboBox的項目或類似的東西...... – fabian

+0

好的,謝謝你的幫助! – ekstroom