Проблема рендеринга диаграммы JFreeChart - PullRequest
1 голос
/ 01 сентября 2011

Этот вопрос является продолжением моего предыдущего вопроса, касающегося отсутствия отображения данных . После приведенных рекомендаций я попытался построить меньший диапазон данных. Как было замечено, когда я работаю с диапазоном данных другого размера, время рендеринга быстро увеличивается. Последний (более или менее) приемлемый набор данных (который загружается в память, но не предназначен для черчения) содержит 16 тыс. Значений. В случае, если мне нужно построить только 100 из них, время рендеринга также огромно.

Код генерации графика выглядит следующим образом:

public void plotXYChart(double dArray[][], String sPlotName, String sSeriesName,
        String sRangeName, int iInitialPoint, int iPlotLength){

    XYSeries series1 = new XYSeries(sSeriesName);
    series1.clear();
    series1.setNotify(false);

    if (iInitialPoint+iPlotLength > dArray.length){
        iPlotLength = dArray.length;
    } else {
        iPlotLength+=iInitialPoint;
    }
    for (int i=iInitialPoint; i < iPlotLength; i++){
        series1.add(dArray[i][0], dArray[i][1], false);
    }

    System.out.println("Elements in series: " + series1.getItemCount());

    XYSeriesCollection dataset = new XYSeriesCollection();
    dataset.removeAllSeries();
    dataset.addSeries(series1);
    System.out.println("Elements in dataset: " + dataset.getItemCount(0));

    chart = null;
    chart = new JFreeChart(new XYPlot(dataset, new NumberAxis(sSeriesName),
    new NumberAxis(sRangeName), new SamplingXYLineRenderer()));

    plotChart(sPlotName, chart);

    XYPlot plot = (XYPlot) chart.getPlot();
    plot.getDomainAxis().setStandardTickUnits(new StandardTickUnitSource());
    plot.getRangeAxis().setStandardTickUnits(new StandardTickUnitSource());

}

Код для JFramePanel, который используется для вывода диаграммы, следующий:

    private void plotChart(String sPlotName, JFreeChart chart){

    if (this.cPanel!=null) {
        cPanel.setChart(chart);
        }
    else
        cPanel = new ChartPanel(chart, true);


    this.chartFrame.add(cPanel);
    if (this.chartFrame.isVisible() == false){
        RefineryUtilities.centerFrameOnScreen(this.chartFrame);
    }
    this.chartFrame.pack();
    this.chartFrame.setVisible(true);
}

Я хотел бы спросить об улучшении времени рендеринга, потому что сейчас я застрял с этой проблемой.

1 Ответ

2 голосов
/ 01 сентября 2011

Сначала распутайте модель и представление, затем вы можете отобразить управляемые части данных в представлении, как предложено здесь .

В качестве альтернативы, вы можете посмотреть на SlidingXYDataset, обсуждалось здесь .

...