如何使用实时数据持续更新折线图

时间:2015-04-23 09:20:49

标签: java javafx

我有两个折线图,在一个折线图中,即chart1,我正在连续更新值,在其他图表即chart2中,基于chart1的峰值,我试图在chart2中显示chart1的峰值。如果峰值(即4到10)的数量较少则没有问题,如果峰值较大,则我的折线图应用程序变得太慢。为了不断更新chart1和chart2中的值,我使用了动画计时器。

以下是几个峰值 enter image description here

下面的图片有更多的峰值然后我的应用程序挂起 enter image description here

为了更好的表现,如何处理动画计时器。

代码更新

在addDataToSeries函数中,我将添加1600个随机值并在chart1中填充值。

在addRffDataToSeries函数中,我填充了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));
        }

    }


}

1 个答案:

答案 0 :(得分:0)

从任何来源获取来自某些Web服务调用或读取某个队列的数据。你需要延迟输入数据。可能是半秒延迟应该没问题。这是因为进入浏览器的数据量太大,而且无法处理相同的数据量。

其次,确保在点移出屏幕后关闭连接,这样可以减少打开连接的数量并提高性能。