装饰JFreeChart

时间:2010-11-16 17:08:46

标签: java jfreechart graphics2d

我想在角落里用时间戳装饰我生成的所有JFreeCharts。在生成图表之后,JFreeChart框架中是否有一种方法可以在图像上绘制?

编辑:请注意,这些图表是在后台线程中生成的,并通过servlet分发,因此没有GUI,我不能只在单独的组件上显示时间戳。

5 个答案:

答案 0 :(得分:4)

一种方法是继承ChartPanel并覆盖paint(Graphics)方法,首先链接到super.paint(Graphics),然后在图表顶部渲染其他文本。

我觉得这对我来说有些苛刻,我个人赞成只将ChartPanel添加到另一个容器JPanel以及代表时间戳的JLabel

答案 1 :(得分:1)

在这里看一下这个论坛帖子:

http://www.jfree.org/phpBB2/viewtopic.php?f=3&t=27939

使用ImageIcon作为水印:

ImageIcon icon = new ImageIcon(new URL(watermarkUrl));
Image image = icon.getImage();
chart.setBackgroundImage(image);
chart.setBackgroundImageAlignment(Align.CENTER);
chart.getPlot().setBackgroundAlpha(0.2f);

答案 2 :(得分:1)

addSubtitle()org.jfree.chart.JFreeChart方法可能是合适的选择。

答案 3 :(得分:1)

经过多次研究之后,我找到了一个解决方案,让你在完成JFreeChart之后在图像上任意绘制,所以我会在这里发布它给后人。就我而言,我正在将图表写入OutputStream,所以我的代码看起来像这样:

BufferedImage chartImage = chart.createBufferedImage(width, height, null);
Graphics2D g = (Graphics2D) chartImage.getGraphics();
/* arbitrary drawing happens here */
EncoderUtil.writeBufferedImage(chartImage, ImageFormat.PNG, outputStream);

答案 4 :(得分:0)

根据我的经验,向JFreeChart添加自定义信息的最佳方法是:   - 实例化相同类型图表的BufferedImage;   - 在BufferedImage上绘制;   - 使用XYImageAnnotation将图像添加到当前图中。

这是代码的准则:

// retrieve image type and create another BufferedImage
int imgType = chart.createBufferedImage(1,1).getType();
BufferedImage bimg = new BufferedImage(width, height, bimg.getType);

// here you can draw inside the image ( relative x & y  )
Graphics2D g2 = (Graphics2D) bimg.getGraphics();
g2.drawString("Hello, JFreeChart " + timestamp, posX, posY );

// instantiate the image annotation, then add to the plot
XYImageAnnotation a = new XYImageAnnotation( x, y, bimg, RectangleAnchor.LEFT );
chart.getPlot().addAnnotation( a );