我在我的一个java应用程序中使用JFreeChart,但问题是它在对图表模型进行任何更改时再次绘制整个图表。
我知道我们可以删除ChartChangeListener并根据我们的需要添加它们,这样它不会每次都触发chartChangeEvent,但它不能解决我的问题。
就我而言,XYSeries超出了X轴上的图表边界。可见的x轴是6厘米。因此,当系列超过6厘米时,我将丢弃1厘米的初始可见数据并再次绘制下一个6厘米的数据。
在这种情况下,它开始闪烁。
答案 0 :(得分:0)
仅绘制可见区域是一个错误的想法。通常你真正想要的是创建一个包含整个图表的BufferedImage,然后你不需要每秒1000次重绘整个图表。如果你无法缓冲整个图表(例如,你正在绘制实时数据),那么如果它大于1px,你应该至少保存缓冲一个点。 在java中填充形状是非常昂贵的操作。
以下代码非常慢(绘制太多点时)
for(int x=0; x < max; x++){
Ellipse2D.Double ellipse = new Ellipse2D.Double(x - 1.5, f(x) -1.5, 3, 3);
g.setPaint(color);
g.draw(ellipse);
g.fill(ellipse);
}
应该替换为
private BufferedImage createBufferedImage(Color color) {
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D buff = bufferedImage.createGraphics();
Ellipse2D.Double ellipse = new Ellipse2D.Double(0, 0, 3, 3);
buff.setPaint(color);
buff.draw(ellipse);
buff.fill(ellipse);
return bufferedImage;
}
AffineTransform at = new AffineTransform();
at.scale(1, 1);
createBufferedImage(Color.RED);
for(int x=0; x < max; x++){
at.setToIdentity();
at.translate(x - 2, y - 2);
g.drawImage(bufferedImage, at, null);
}
也是如此,只是快了好几倍。 JFreeChart中的AFAIK他们没有正确使用缓冲,这是它如此缓慢的原因之一。