2015-04-23 83 views
0

我有兩個折線圖,其中一個折線圖即chart1,我正在連續更新值,在其他圖表即chart2中,基於chart1的峯值,我正在嘗試以顯示chart2中chart1的峯值。如果峯值(即4到10)數量較少,那麼沒有問題,如果峯值更大,那麼我的折線圖應用程序變得太慢。爲了不斷更新chart1和chart2中的值,我使用了Animation timer。如何使用實時數據連續更新折線圖

下面是很少峯值 enter image description here

下面的圖像有更多的峯值,然後我的申請被掛 enter image description here

爲了獲得更好的性能如何與動畫計時器做。

代碼更新

在addDataToSeries功能我加入1600個隨機值,並在chart1填充值。

在addRffDataToSeries功能,我從你從一些Web服務調用獲取數據或閱讀一些隊列什麼都源填充在chart2

private void prepareTimeLine() { 
    timer = new AnimationTimer() { 

     @Override 
     public void handle(long l) { 
      plotData.addDataToSeries(); 

     } 
    }; 

} 

private void startTimer() { 
    timer.start(); 
} 

private void stopTimer() { 
    timer.stop(); 
    System.out.println(" " + lineChart.getData().size()); 
    System.out.println(" " + series.getData().size()); 
    if (lineChart.getData().size() > 0) { 
     series.getData().remove(0, series.getData().size()); 
    } 
} 

private void prepareRffTimeLine() { 
    rffTimer = new AnimationTimer() { 

     @Override 
     public void handle(long l) { 
      rffSeries.getData().remove(0, rffSeries.getData().size()); 
      plotData.addRffDataToSeries(); 
     } 
    }; 

} 

private void startRffTimer() { 
    rffTimer.start(); 
} 

private void stopRffTimer() { 
    rffTimer.stop(); 
    if (rffLineChart.getData().size() > 0) { 
     rffSeries.getData().remove(0, rffSeries.getData().size()); 
    } 
} 

public void addDataToSeries() { 

    double x = 0; 
    double y = 0; 
    int i = 1; 

    seriesXData.clear(); 
    seriesYData.clear(); 
    for (i = 1; i <= 1596; i++) { 
     x = Math.random() * i + 1; 
     y = (Math.random() * ((-100) - (-130))) + -130; 
     seriesXData.add(new XYChart.Data(x, y)); 
     seriesYData.add(new XYChart.Data(x, y)); 
    } 

    seriesXData.add(new XYChart.Data(300.0, -60.0)); 
    seriesXData.add(new XYChart.Data(600.0, -50.0)); 
    seriesXData.add(new XYChart.Data(900.0, -30.0)); 
    seriesXData.add(new XYChart.Data(1300.0, -10.0)); 

    seriesYData.add(new XYChart.Data(300.0, -60.0)); 
    seriesYData.add(new XYChart.Data(600.0, -50.0)); 
    seriesYData.add(new XYChart.Data(900.0, -30.0)); 
    seriesYData.add(new XYChart.Data(1300.0, -10.0)); 

    Collections.sort(seriesXData, new ArrangeXData()); 
    Collections.sort(seriesYData, new ArrangeYData()); 
    series.getData().addAll(seriesXData); 

    if (series.getData().size() > 1600) { 
     series.getData().remove(0, 1600); 
    } 


} 

public void addRffDataToSeries() { 

    Comparator<XYChart.Data<Double, Double>> c = new Comparator<XYChart.Data<Double, Double>>() { 
     @Override 
     public int compare(XYChart.Data<Double, Double> o1, XYChart.Data<Double, Double> o2) { 
      return o1.getYValue().compareTo(o2.getYValue()); 
     } 
    }; 

    int index = Collections.binarySearch(seriesYData, new XYChart.Data<Double, Double>(null, Double.parseDouble(String.valueOf(Line.y))), c); 

    int insertion_point = -(index + 1); 
    if (seriesYData.size() <= 0) { 
     return; 
    } 
    List<XYChart.Data<Double, Double>> res = seriesYData.subList(insertion_point, seriesYData.size()); 

    for (int ind = 0; ind < res.size(); ind++) { 
     for (int pos = Bounds.x; pos > Bounds.y; pos--) { 
      rffSeries.getData().add(new XYChart.Data(res.get(ind).getXValue(), pos)); 
     } 

    } 


} 
+0

......那裏應該有個問題嗎? – specializt

+0

@specializt OP想改善代碼的性能 – Lrrr

+0

你能展示一些相關的代碼嗎? –

回答

0

峯值。你需要延遲輸入數據。可能會有半秒延遲應該沒事。這是因爲傳入瀏覽器的數據量太大,無法處理。

其次,確保在點移出屏幕後關閉連接,這樣可以減少打開的連接數並提高性能。