I used the trashgod solution used, but I expanded this solution to support the type of print that I would like to do with my application.
, JFreechart, . , , :

JPanel Printable. , JFreecharts, /. , , .
, , . . JFreeChart ChartPanel PageFormat.
CustomChartPanel:
package com.company.jfreeChartCustom;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.geom.Rectangle2D;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import com.lowagie.text.Row;
public class CustomChartPanel extends JPanel implements Printable{
List<JFreeChart> charts = new ArrayList<JFreeChart>();
List<ChartPanel> panels = new ArrayList<ChartPanel>();
ChartLayoutInstructions layoutInstructions;
public CustomChartPanel(){
super();
}
public CustomChartPanel(JFreeChart chart){
super();
charts.add(chart);
}
public CustomChartPanel(List<JFreeChart> charts, ChartLayoutInstructions layoutInstructions){
super();
this.layoutInstructions = layoutInstructions;
for(JFreeChart chart : charts){
this.charts.add(chart);
}
createUIComponents();
}
protected void createUIComponents(){
int size = Math.min(layoutInstructions.getColumns() * layoutInstructions.getRows(), charts.size());
this.setLayout(new GridLayout(layoutInstructions.getRows(), layoutInstructions.getColumns()));
for(int i = 0; i < size; i++ ){
System.err.println("Adding chart");
ChartPanel chartPanel = new ChartPanel(charts.get(i));
chartPanel.setMaximumDrawHeight(20000);
chartPanel.setMinimumDrawHeight(0);
chartPanel.setMaximumDrawWidth(20000);
chartPanel.setMinimumDrawWidth(0);
chartPanel.setPopupMenu(null);
panels.add(chartPanel);
this.add(chartPanel);
}
}
public void createPrintJob(){
PrinterJob job = PrinterJob.getPrinterJob();
PageFormat pf = job.defaultPage();
PageFormat pf2 = job.pageDialog(pf);
if (pf2 != pf) {
job.setPrintable(this, pf2);
if (job.printDialog()) {
try {
job.print();
}
catch (PrinterException e) {
JOptionPane.showMessageDialog(this, e);
}
}
}
}
@Override
public int print(Graphics g, PageFormat pf, int pageIndex)
throws PrinterException {
System.err.println("PRINTING");
if(pageIndex != 0){
return NO_SUCH_PAGE;
}
List<PageFormat> pageFormats = new ArrayList<PageFormat>();
double x = pf.getImageableX();
double y = pf.getImageableY();
double cellWidth = pf.getImageableWidth() / layoutInstructions.getColumns();
double cellHeight = pf.getImageableHeight() / layoutInstructions.getRows();
for(int i=1; i <= layoutInstructions.getRows(); i++){
double rowOffset = (i-1)*cellHeight + y;
for(int j=1; j <= layoutInstructions.getColumns(); j++){
PageFormat format = new PageFormat();
Paper paper = new Paper();
double columnOffset = (j-1)*cellWidth + x;
paper.setImageableArea(columnOffset, rowOffset, cellWidth, cellHeight);
format.setPaper(paper);
pageFormats.add(format);
}
}
int size = Math.min(pageFormats.size(), panels.size());
for(int i = 0; i < size; i++ ){
panels.get(i).print(g, pageFormats.get(i), pageIndex);
}
return PAGE_EXISTS;
}
ChartLayoutInstructions:
. , , CustomChartPanel.
package com.company.jfreeChartCustom;
public class ChartLayoutInstructions {
int rows;
int columns;
public ChartLayoutInstructions(int rows, int columns, boolean allowSwap){
this.rows = Math.abs(rows);
this.columns = Math.abs(columns);
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = Math.abs(rows);
}
public int getColumns() {
return columns;
}
public void setColumns(int columns) {
this.columns = Math.abs(columns);
}
}