2016-11-11 42 views
0

JavaFX使用可觀察列表作爲其圖表系列。我想從一個不同的線程加載系列中的數據,我通過使用Task和Platform.runLater來完成。然而,UI仍然不是非常敏感,數據看起來並不順利,未來從JavaFX中的另一個線程加載圖表系列中的數據

我想以下情況發生:

  • 用戶界面保持響應。
  • 數據在圖形中平滑地加載 - 每個系列一次一個。操作

    訂單:

    1. 加載頁面
    2. 裝入空圖表系列在圖表
    3. 按生成按鈕
    4. 將數據加載到每個系列

相關部分代碼:

負載串聯成圖表

private static ObservableList<XYChart.Series<Number, Number>> pathSeries = FXCollections.observableArrayList();  

final LineChart<Number,Number> pathChart = 
      new LineChart<Number,Number>(xAxis,yAxis); 

    for (int n=0; n<proc.getNumPath(); n++) 
    { 
     pathSeries.add(new Series<Number, Number>()); 
    } 

    pathChart.getData().addAll(pathSeries); 

載荷數據系列

Task task = new Task<Void>() { 
    @Override public Void call() { 

     // PATH SERIES 
     for (int n=0; n<proc.getNumPath(); n++) 
     { 
      for(int i=0; i<=proc.getM(); i++) 
      { 
       int pathNumber = n; 
       int dataIndex = i; 

       Platform.runLater(new Runnable() { 
        @Override 
        public void run() { 
         pathSeries.get(pathNumber).getData().add(new XYChart.Data<Number, Number>(proc.getT()[dataIndex], 
           proc.getX()[pathNumber][dataIndex])); 
        } 
       }); 
       if (isCancelled()) { 
        updateMessage("Cancelled"); 
        break; 
       } 
      } 
     } 
     return null; 
    } 
}; 

@FXML 
public void initialize(){ 

    generateButton.setOnAction(e -> { 
     pathWorker = new Thread(task); 
     pathWorker.setDaemon(true); 
     pathWorker.start(); 
    }); 
} 

我怎樣才能提高我的代碼沒有得到太複雜?

enter image description here

+1

你可能不會喜歡這個評論,但是這看起來像是大量的數據。圖表API(imho)並不是真正爲這種規模的數據設計的,您可能會發現需要使用畫布來滾動您自己的實現(例如,使用畫布)以獲得具有大量數據的響應式UI。基本問題是每個數據點由場景圖中的節點表示,並且每個節點都有大量的屬性,其外觀由相當昂貴的CSS代碼控制。你可以嘗試一些東西 - 例如關閉圖表上的動畫 - 但這可能是太多的數據。 –

+0

我想調用Thread.sleep(100);將有助於GUI響應。玩數字。您的數據將需要更長的時間才能加載。 – Sedrick

回答

0

使用這裏面的for循環。

Thread.sleep(100); 
相關問題