JFreechart替代方案

时间:2011-03-23 18:46:35

标签: java graph charts jfreechart

我在我的一个java应用程序中使用JFreeChart,但问题是它在对图表模型进行任何更改时再次绘制整个图表。

我知道我们可以删除ChartChangeListener并根据我们的需要添加它们,这样它不会每次都触发chartChangeEvent,但它不能解决我的问题。

就我而言,XYSeries超出了X轴上的图表边界。可见的x轴是6厘米。因此,当系列超过6厘米时,我将丢弃1厘米的初始可见数据并再次绘制下一个6厘米的数据。

在这种情况下,它开始闪烁。

1 个答案:

答案 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他们没有正确使用缓冲,这是它如此缓慢的原因之一。