我想在角落里用时间戳装饰我生成的所有JFreeCharts。在生成图表之后,JFreeChart框架中是否有一种方法可以在图像上绘制?
编辑:请注意,这些图表是在后台线程中生成的,并通过servlet分发,因此没有GUI,我不能只在单独的组件上显示时间戳。
答案 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 );