Украшение JFreeChart - PullRequest
       2

Украшение JFreeChart

3 голосов
/ 16 ноября 2010

Я хотел бы украсить все мои сгенерированные JFreeCharts с отметкой времени в углу. Есть ли способ в рамках JFreeChart рисовать изображение после того, как диаграмма была сгенерирована?

РЕДАКТИРОВАТЬ: обратите внимание, что эти диаграммы генерируются в фоновом потоке и распространяются через сервлет, поэтому нет графического интерфейса, и я не могу просто отобразить метку времени на отдельном компоненте.

Ответы [ 5 ]

4 голосов
/ 16 ноября 2010

Один из подходов заключается в создании подкласса ChartPanel и переопределении метода paint(Graphics) для первой цепочки на super.paint(Graphics) и последующей визуализации дополнительного текста поверх диаграммы.

Мне это кажется немного хакерским, и я лично предпочел бы просто добавить ChartPanel в другой контейнер JPanel вместе с JLabel, представляющим метку времени.

1 голос
/ 18 ноября 2010

Поработав еще немного, я нашел решение, которое позволяет произвольно рисовать изображение после того, как JFreeChart покончит с ним, поэтому я опубликую его здесь для потомков.В моем случае я записывал диаграмму в OutputStream, поэтому мой код выглядел примерно так:

BufferedImage chartImage = chart.createBufferedImage(width, height, null);
Graphics2D g = (Graphics2D) chartImage.getGraphics();
/* arbitrary drawing happens here */
EncoderUtil.writeBufferedImage(chartImage, ImageFormat.PNG, outputStream);
1 голос
/ 17 ноября 2010

Подходящей альтернативой может быть addSubtitle() метод org.jfree.chart.JFreeChart.

1 голос
/ 16 ноября 2010

Загляните на этот пост здесь:

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);
0 голосов
/ 28 января 2013

По моему опыту, лучший способ добавить пользовательскую информацию в 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 );
...