我有一个超过100k记录的二维数组。当我试图绘制图表时 - CPU很难加载,没有其他任何事情发生。我检查了所有可能的方法,包括反别名,禁用事件监听器等。没有什么工作。我假设表演接近3-5分钟(好吧,这是相对的,但我想知道如何达到它)。
因此,我问是否有办法正确显示数据?我有两个功能,一个用于指定图表,另一个用于绘图:
public void plotXYChart(double dArray[][], String sPlotName, String sSeriesName,
String sRangeName){
XYSeries series1 = new XYSeries(sSeriesName);
series1.clear();
for (int i=0; i< dArray.length; i++){
series1.add(dArray[i][0], dArray[i][1], false);
}
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.removeAllSeries();
dataset.addSeries(series1);
dataset.setAutoWidth(false);
dataset.setIntervalWidth(2000);
chart = ChartFactory.createXYLineChart(sPlotName, sSeriesName, sRangeName,
dataset, PlotOrientation.VERTICAL, false,
true, false);
chart.setAntiAlias(false);
XYPlot plot = (XYPlot) chart.getPlot();
plot.getDomainAxis().setStandardTickUnits(new StandardTickUnitSource());
plot.getRangeAxis().setStandardTickUnits(new StandardTickUnitSource());
SamplingXYLineRenderer renderer = new SamplingXYLineRenderer();
plot.setRenderer(renderer);
plotChart(sPlotName, chart);
}
private void plotChart(String sPlotName, JFreeChart chart){
if (this.cPanel!=null)
cPanel.setChart(chart);
else
cPanel = new ChartPanel(chart);
cPanel.setAutoscrolls(false);
cPanel.setDomainZoomable(false);
cPanel.setRangeZoomable(false);
cPanel.setRefreshBuffer(false);
cPanel.setDoubleBuffered(rootPaneCheckingEnabled);
this.chartFrame.add(cPanel);
this.chartFrame.pack();
if (this.chartFrame.isVisible() == false)
RefineryUtilities.centerFrameOnScreen(this.chartFrame);
this.chartFrame.setVisible(true);
}
答案 0 :(得分:3)
这不是JFreeChart问题。您只是想绘制太多数据。如果你尝试用摇摆画100k线,你会感觉到同样的性能问题。减少数据集。
您也可以尝试一下,但我不确定它是否有效。不显示生成的ChartPanel。而是使用以下方法生成ChartPanel的图像:
Image image = chartPanel.createImage ();
在您喜欢的组件内显示生成的图像。图像的生成时间可能非常高,但一旦生成,它应该更快地显示它并调整存储它的组件的大小。那是因为它是静态图像,并且在显示它时不会调用绘图基元。 当然,通过这种方式,您将放弃所有ChartPanel函数,只获取它的图像。
答案 1 :(得分:1)