Java JFreechart备选方案

Java JFreechart备选方案,java,graph,charts,jfreechart,Java,Graph,Charts,Jfreechart,我在我的一个java应用程序中使用JFreeChart,但它的问题是,当您对图表模型进行任何更改时,它会再次绘制整个图表 我知道我们可以删除ChartChangeListener并根据需要添加它们,这样它就不会每次都触发chartChangeEvent,但这并不能解决我的问题 在我的例子中,XYSeries超出了X轴上的图表边界。可见x轴为6厘米。因此,当序列超过6cm时,我将丢弃1cm初始可见数据,并再次绘制下一个6cm数据 在这种情况下,它开始闪烁 只绘制可见区域是错误的想法。通常,您真正想

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

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

在我的例子中,XYSeries超出了X轴上的图表边界。可见x轴为6厘米。因此,当序列超过6cm时,我将丢弃1cm初始可见数据,并再次绘制下一个6cm数据


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

只绘制可见区域是错误的想法。通常,您真正想要的是创建一个包含整个图表的BuffereImage,然后不需要每秒重新绘制整个图表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中,他们没有正确使用缓冲,这是它如此缓慢的原因之一。

您是在寻找JFreeChart的替代方案,还是不涉及其他图表库的解决方案?请显示一个显示闪烁的。JFreeChart很慢,是的。因此,编写您自己的库。@最好在jfreechart中为其编写解决方案。。。但如果在jfreechart中不可能,那么jfreechart的其他替代方案