【问题标题】:How to print a large JPanel in several page如何在多页中打印大 JPanel
【发布时间】:2014-09-18 17:40:49
【问题描述】:

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

【问题讨论】:

  • 您是否考虑过将所有单独的组件放在自己的 JPanel 上专门用于打印?
  • 是的,我尝试列出 JPanel 并使用 Book 对象打印它们。在对话框中显示 6 页,但打印后我得到一页。另外,如果我这样做了,我会得到 JTable 的所有大页面?
  • 您可以尝试使用 iText 将它们打印到 PDF 中。这将节省纸张并让您查看结果并快速修改它们。
  • 我使用 PDF creator 来预览结果。我不知道如何使用 iText。对于 JTable,我不需要实现 Printable 或 Pageable。所以如果我打印它,如果它很大,我会得到所有页面吗?如果是,我将重新尝试单独打印它们
  • 有一种方法可以将 JPanel 转换为可打印对象并将其作为整个页面传递给 iText。我相信它是 Graphics2D,但我不知道它的来源或记忆。您可以从技术上获取单个组件,并根据 JPanel 的实际大小(即打印 (0,0,600,600) 然后 (0,600,0,1200))将它们分成每个页面。如果您只是想打印 JPanel,而不是 JTable 上的所有内容。

标签: java printing jpanel


【解决方案1】:

试试这个?

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

【讨论】:

  • 只显示第一页。其他页面为空白
  • 请简单介绍一下?
  • 我将单独打印所有 JPanel。我认为这是最好的方式
【解决方案2】:

我对来自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 的表达式更改为:

(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 的第一个或第二个参数为正值时,图形分别向右或向下移动。

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

对于大于0pageIndex- pageIndex * pageFormat.getImageableHeight() 将图像pageIndex-倍于页面高度移动到顶部。因此,pageIndex 所指的区域被打印出来。

原始损坏来源:

https://community.oracle.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多