如何在多个页面中打印大型JPanel

我想打印一个非常大的面板,这个面板包含一些组件,如jtable,jlabel和其他jpanel。 现在我想在不同的页面中打印它。 但我不知道该怎么做。 我在面板类中实现了Printable。 但如果我打印它,我只得到一页。

尝试这个 ?

package com.mymoney.util; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.print.PageFormat; import java.awt.print.Pageable; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import javax.swing.RepaintManager; public class PrintUtil implements Printable, Pageable { private Component componentToBePrinted; private PageFormat format; private int numPages; public PrintUtil(Component componentToBePrinted) { this.componentToBePrinted = componentToBePrinted; Dimension page = this.componentToBePrinted.getPreferredSize(); numPages = (int) Math.ceil(page.height/format.getImageableY()); } public void print() { PrinterJob printJob = PrinterJob.getPrinterJob(); printJob.setPrintable(this); printJob.setPageable(this); format = printJob.defaultPage(); if (printJob.printDialog()) try { printJob.print(); } catch(PrinterException pe) { System.out.println("Error printing: " + pe); } } public int print(Graphics g, PageFormat pageFormat, int pageIndex) { if ((pageIndex < 0) | (pageIndex >= numPages)) { return(NO_SUCH_PAGE); } else { Graphics2D g2d = (Graphics2D)g; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()- pageIndex*componentToBePrinted.getPreferredSize().height); disableDoubleBuffering(componentToBePrinted); componentToBePrinted.paint(g2d); enableDoubleBuffering(componentToBePrinted); return(PAGE_EXISTS); } } public static void disableDoubleBuffering(Component c) { RepaintManager currentManager = RepaintManager.currentManager(c); currentManager.setDoubleBufferingEnabled(false); } public static void enableDoubleBuffering(Component c) { RepaintManager currentManager = RepaintManager.currentManager(c); currentManager.setDoubleBufferingEnabled(true); } @Override public int getNumberOfPages() { // TODO Auto-generated method stub return numPages; } @Override public PageFormat getPageFormat(int arg0) throws IndexOutOfBoundsException { return format; } @Override public Printable getPrintable(int arg0) throws IndexOutOfBoundsException { // TODO Auto-generated method stub return this; } } 

参考 – > https://community.oracle.com/thread/1263759?start=0&tstart=0

我对Harry的问题的编辑未被接受,因此我将我的编辑作为新答案发布。

以下代码适用于我(我测试过):

 import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.print.*; import javax.swing.RepaintManager; public class PrintMultiPageUtil implements Printable, Pageable { private Component componentToBePrinted; private PageFormat format; private int numPages; public PrintMultiPageUtil(Component componentToBePrinted) { this.componentToBePrinted = componentToBePrinted; // get total space from component Dimension totalSpace = this.componentToBePrinted.getPreferredSize(); // calculate for DIN A4 format = PrinterJob.getPrinterJob().defaultPage(); numPages = (int) Math.ceil(totalSpace .height/format.getImageableHeight()); } public void print() { PrinterJob printJob = PrinterJob.getPrinterJob(); // show page-dialog with default DIN A4 format = printJob.pageDialog(printJob.defaultPage()); printJob.setPrintable(this); printJob.setPageable(this); if (printJob.printDialog()) try { printJob.print(); } catch(PrinterException pe) { System.out.println("Error printing: " + pe); } } public int print(Graphics g, PageFormat pageFormat, int pageIndex) { if ((pageIndex < 0) | (pageIndex >= numPages)) { return(NO_SUCH_PAGE); } else { Graphics2D g2d = (Graphics2D)g; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY() - pageIndex * pageFormat.getImageableHeight()); disableDoubleBuffering(componentToBePrinted); componentToBePrinted.paint(g2d); enableDoubleBuffering(componentToBePrinted); return(PAGE_EXISTS); } } public static void disableDoubleBuffering(Component c) { RepaintManager currentManager = RepaintManager.currentManager(c); currentManager.setDoubleBufferingEnabled(false); } public static void enableDoubleBuffering(Component c) { RepaintManager currentManager = RepaintManager.currentManager(c); currentManager.setDoubleBufferingEnabled(true); } @Override public int getNumberOfPages() { // TODO Auto-generated method stub return numPages; } @Override public PageFormat getPageFormat(int arg0) throws IndexOutOfBoundsException { return format; } @Override public Printable getPrintable(int arg0) throws IndexOutOfBoundsException { // TODO Auto-generated method stub return this; } } 

NUMPAGES

我将numPages的表达式numPages为:

 (int) Math.ceil(page.height/format.getImageableHeight()) 

这将总高度(jpanel的高度)除以一页的高度,从而计算所有页面的数量。

g2d.translate

我做了以下更改:在这一行:

 g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY() - pageIndex * pageFormat.getImageableHeight()); 

componentToBePrinted.getPreferredSize().height更改为pageFormat.getImageableHeight()g2d.translate的第一个或第二个参数的g2d.translate将图形向右或向下移动。

.getImageableX().getImageableY()帮助定位图形,使其不与填充重叠。

对于大于0 - pageIndex * pageFormat.getImageableHeight()- pageIndex * pageFormat.getImageableHeight()将图像pageIndex将页面高度移动到顶部。 因此打印pageIndex引用的区域。

原来破碎的来源:

https://community.oracle.com