如何在多个页面中打印大型JPanel [英] How to print a large JPanel in several page

查看:119
本文介绍了如何在多个页面中打印大型JPanel的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to print a very large panel and this panel contains some components like jtable, jlabel and others jpanel. Now i want to print it in differents pages. But i don't know how to do it. I have implemented Printable in my panel class. But if i print it, I get only one page.

推荐答案

试试这个?

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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆