我想在角落里用时间戳装饰我生成的所有 JFreeCharts。在生成图表后,JFreeChart 框架中有没有办法在图像上绘制?
编辑:请注意,这些图表是在后台线程中生成并通过 servlet 分发的,因此没有 GUI,我不能只在单独的组件上显示时间戳。
我想在角落里用时间戳装饰我生成的所有 JFreeCharts。在生成图表后,JFreeChart 框架中有没有办法在图像上绘制?
编辑:请注意,这些图表是在后台线程中生成并通过 servlet 分发的,因此没有 GUI,我不能只在单独的组件上显示时间戳。
一种方法是继承 ChartPanel 并覆盖该paint(Graphics)
方法以首先链接super.paint(Graphics)
并随后在图表顶部呈现附加文本。
不过,这对我来说有点 hacky,我个人更喜欢简单地将与表示时间戳一起添加ChartPanel
到另一个容器中。JPanel
JLabel
在此处查看此论坛帖子:
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);
的addSubtitle()
方法org.jfree.chart.JFreeChart
可以是合适的替代方案。
又摸索了一番,我找到了一个解决方案,可以让您在 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 的最佳方法是: - 实例化一个相同类型的图表的 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 );