2015-06-08 54 views
3

我在这里试图制作一个秋千应用程序。现在我的目标是打印收据。我已经建立了关于JPanel的所有细节。我试图在java中打印JPanel,但它打印一个空白文档。如何在java中打印jpanel?

在JPanel的我想打印: I want to print only white panel 代码:

1.ActionListener 

btnPrint.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      PrinterJob pjob = PrinterJob.getPrinterJob(); 
      PageFormat preformat = pjob.defaultPage(); 
      preformat.setOrientation(PageFormat.LANDSCAPE); 
      PageFormat postformat = pjob.pageDialog(preformat); 
      //If user does not hit cancel then print. 
      if (preformat != postformat) { 
       //Set print component 
       pjob.setPrintable(new Printer(printPanel), postformat); 
       if (pjob.printDialog()) { 
        try { 
         pjob.print(); 
        } catch (PrinterException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    }); 

2.打印机类:

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.Printable; 
import java.awt.print.PrinterException; 

public class Printer implements Printable { 
    final Component comp; 

public Printer(Component comp){ 
    this.comp = comp; 
} 

@Override 
public int print(Graphics g, PageFormat format, int page_index) 
     throws PrinterException { 
    if (page_index > 0) { 
     return Printable.NO_SUCH_PAGE; 
    } 

    // get the bounds of the component 
    Dimension dim = comp.getSize(); 
    double cHeight = dim.getHeight(); 
    double cWidth = dim.getWidth(); 

    // get the bounds of the printable area 
    double pHeight = format.getImageableHeight(); 
    double pWidth = format.getImageableWidth(); 

    double pXStart = format.getImageableX(); 
    double pYStart = format.getImageableY(); 

    double xRatio = pWidth/cWidth; 
    double yRatio = pHeight/cHeight; 


    Graphics2D g2 = (Graphics2D) g; 
    g2.translate(pXStart, pYStart); 
    g2.scale(xRatio, yRatio); 
    comp.printAll(g2); 

    return Printable.PAGE_EXISTS; 
} 



} 
+0

你与该行'如果比较引用{' – user489041

+0

@ user489041事实上,即使'如果(preformat.equals (postformat)){'可能不起作用,因为'PageFormat.hashCode()'没有被覆盖。此外,应该删除此语句,因为取消页面对话框意味着用户对当前设置感到满意,并且应该出现打印对话框。 –

+0

仍然无法正常工作。删除后if(preformat!= postformat)。 –

回答

0

简单的方法来打印Swing组件:(!预成型= postformat)!

/** 
* Create a BufferedImage for Swing components. The entire component will be 
* captured to an image. 
* 
* @param component Swing component to create image from 
* @return image the image for the given region 
*/ 
public static BufferedImage createImage(JComponent component) 
{ 
    Dimension d = component.getSize(); 

    if (d.width == 0 || d.height == 0) 
    { 
     d = component.getPreferredSize(); 
     component.setSize(d); 
    } 

    Rectangle region = new Rectangle(0, 0, d.width, d.height); 
    return ScreenImage.createImage(component, region); 
} 

/** 
* Create a BufferedImage for Swing components. All or part of the component 
* can be captured to an image. 
* 
* @param component Swing component to create image from 
* @param region The region of the component to be captured to an image 
* @return image the image for the given region 
*/ 
public static BufferedImage createImage(JComponent component, Rectangle region) 
{ 
    // Make sure the component has a size and has been layed out. 
    // (necessary check for components not added to a realized frame) 

    if (!component.isDisplayable()) 
    { 
     Dimension d = component.getSize(); 

     if (d.width == 0 || d.height == 0) 
     { 
      d = component.getPreferredSize(); 
      component.setSize(d); 
     } 

     layoutComponent(component); 
    } 

    BufferedImage image = new BufferedImage(region.width, region.height, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2d = image.createGraphics(); 

    // Paint a background for non-opaque components, 
    // otherwise the background will be black 

    if (!component.isOpaque()) 
    { 
     g2d.setColor(component.getBackground()); 
     g2d.fillRect(region.x, region.y, region.width, region.height); 
    } 

    g2d.translate(-region.x, -region.y); 
    component.paint(g2d); 
    g2d.dispose(); 
    return image; 
} 

public int print(Graphics g, PageFormat pf, int i) throws PrinterException  { 

    /* 
    * User (0,0) is typically outside the imageable area, so we must 
    * translate by the X and Y values in the PageFormat to avoid clipping 
    */ 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.translate(pf.getImageableX(), pf.getImageableY()); 

    //get the image to print 
    BufferedImage theImage = createImage(/*your JPanel*/); 


    double pageWidth = pf.getImageableWidth(); 
    double pageHeight = pf.getImageableHeight(); 
    double imageWidth = theImage.getWidth(); 
    double imageHeight = theImage.getHeight(); 
    double scaleX = pageWidth/imageWidth; 
    double scaleY = pageHeight/imageHeight; 
    double scaleFactor = Math.min(scaleX, scaleY); 
    g2d.scale(scaleFactor, scaleFactor); 
    g.drawImage(theImage, 0, 0, Color.WHITE, null); 

    /* tell the caller that this page is part of the printed document */ 
    return PAGE_EXISTS; 
} 
+0

但是,如何将这段代码整合到我的代码中,你可以看到这些代码是静态方法:( –

+0

)它们应该是静态的,但它们不是必须的,只需将它们添加到你的类中。 – user489041

+0

什么是'layoutComponent'方法 – ryvantage

0
  • 关闭双缓冲只是Component.printAll(Graphics g)语句之前(虽然记住刚刚恢复其状态的设置)。

  • 此外,我会在两个维度上使用相同的比例因子来考虑宽高比。

    double xyRatio = Math.min(pWidth/cWidth, pHeight/cHeight); 
    
  • 添加一些记录或System.out.println(String)语句来缩小您的问题!