JFreechart: сохранить в png-файл ВСЕ компоненты chartPanel - PullRequest
0 голосов
/ 07 февраля 2020

Используя JFree, я хотел бы создать XY-график и написать некоторую информацию в правом поле за пределами графика ... и сохранить всю ее (т. Е. Plot + information) в png-файле. Я думал, что нашел способ сделать это с помощью следующего кода:

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.EmptyBorder;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisSpace;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;

public class example {

    public static void main(String[] args) {

        XYSeriesCollection dataset = new XYSeriesCollection();
        XYSeries series =new XYSeries("data");
        series.add(1, 1);
        series.add(2, 2);
        series.add(3, 3);
        series.add(4, 4);
        dataset.addSeries(series);

        // create the chart...
        final JFreeChart chart = ChartFactory.createXYLineChart(
                "Example plot",     
                "X AXIS",           
                "Y AXIS",           
                dataset,            
                PlotOrientation.VERTICAL,
                true,               
                true,               
                false               
                );


        int plotWidth = 500;
        int leftMargin = 70;
        int rightMargin = 400;

        final XYPlot plot = chart.getXYPlot();
        // change margin size
        AxisSpace axisSpace=new AxisSpace();
        axisSpace.setRight(rightMargin);
        axisSpace.setLeft(leftMargin);
        plot.setFixedRangeAxisSpace(axisSpace);     


        // add text outside the plot area
        Box b = new Box(BoxLayout.Y_AXIS);
        b.setBorder(new EmptyBorder(50, plotWidth+leftMargin, 100, 210));
        JLabel label = new JLabel();
        label.setText("I want to add some");
        b.add(label);
        label = new JLabel();
        label.setText("information about the plot");
        b.add(label);
        label = new JLabel();
        label.setText("here outside the graph");
        b.add(label);

        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500+400, 500));
        chartPanel.add(b);
        JFrame container = new ApplicationFrame("");
        container.setContentPane(chartPanel);
        container.pack();
        container.setVisible(true);


    }

}

Когда график отображается в рамке, я получил следующее:

enter image description here

Однако, когда я сохраняю его (выполняю досаву, допринт или сохранение как, или через буферизованное изображение), я получаю следующее:

enter image description here

Есть ли способ иметь все компоненты диаграммы в моем файле png? Есть ли другой способ поместить информацию в нужное поле и сохранить полный результат в png-файле?

Спасибо за внимание.

1 Ответ

2 голосов
/ 07 февраля 2020

выполнение досавки, допринта или сохранения как

Я ничего не знаю о методах, предоставляемых API JFreeChart, поэтому понятия не имею, как эти методы работают.

Однако мне кажется, что "chartPanel" является единственным компонентом, добавленным в кадр. Так что, если вы создаете изображение «chartPanel», вы должны получить изображение всего, что добавлено к фрейму.

Базовый c код для создания изображения любого компонента:

Dimension d = component.getSize();
BufferedImage image = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
component.print( g2d );
g2d.dispose();
ImageIO.write(image, ".jpg", new File(...));

Или вы можете проверить Изображение экрана для класса, который позволяет вам создать образ любого компонента Swing.

...