Java 装饰JFreeChart

Java 装饰JFreeChart,java,jfreechart,graphics2d,Java,Jfreechart,Graphics2d,我想在角落里用一个时间戳装饰我生成的所有JFreeCharts。JFreeChart框架中是否有一种方法可以在图表生成后在图像上绘制 编辑:请注意,这些图表是在后台线程中生成的,并通过servlet分发,因此没有GUI,我不能只在单独的组件上显示时间戳。一种方法是将ChartPanel子类化,并覆盖paint(Graphics)方法以首先链接到super.paint(Graphics),然后在图表顶部呈现附加文本 这让我感觉有点不舒服,我个人倾向于简单地将ChartPanel添加到另一个容器JP

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


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

一种方法是将ChartPanel子类化,并覆盖
paint(Graphics)
方法以首先链接到
super.paint(Graphics)
,然后在图表顶部呈现附加文本


这让我感觉有点不舒服,我个人倾向于简单地将
ChartPanel
添加到另一个容器
JPanel
以及一个代表时间戳的
JLabel

看看这个论坛帖子:

使用图像图标作为水印的:

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

使用的方法可能是一个合适的选择。

在仔细研究之后,我找到了一个解决方案,可以在JFreeChart完成后在图像上任意绘制,因此我将在这里为子孙后代发布。在我的例子中,我正在将图表写入OutputStream,因此我的代码如下所示:

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

根据我的经验,向JFreeChart添加自定义信息的最佳方法是: -实例化同一类型图表的BuffereImage; -在BuffereImage上绘制; -使用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 );

第一个“黑客”解决方案会起作用,我确实想到了,但我希望JFreeChart能为类似的东西提供更直接的支持。如果没有更好的,我就接受。第二个不适合我,因为我没有在桌面应用程序中显示它;我只是在后台线程中生成图表,并通过servlet分发它们。现在,在再次阅读时,我意识到,你的两个答案都假设我正在运行一个桌面应用程序,所以这对我不起作用。不过,它也可以为其他人使用,所以我仍在提高投票率。我真的不想使用ImageIcon,因为我想显示动态字符串而不是固定图像,但如果找不到更好的图像,我想我可以为字符串生成一个图像。这肯定会让我获得图像上的时间戳,我为此投票,但这是以牺牲一些图表渲染空间为代价的。由于角落里经常有空白,我想把时间戳分层放在图像的顶部,而不是给它分配空间。@Robert J.Walker:我和你一样关心空间。您可以查看
PolarPlot
,它具有
addCornerTextItem()
。我通常只编辑主标题以包含“截至”,其中表示查询日期。