How to print jpanel in java?

I am trying to make a swing app here. Now my goal is to print the receipt. I have set all details to JPanel. I'm trying to print a JPanel in java, but it prints a blank document.

In JPanel, I want to print this: I want to print only white panel  code:

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.Printer class:

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;
 }



}

      

+3


source to share


2 answers


An easy way to print Swing components:



/**
 * 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


source


  • Disable double buffering immediately before the statement Component.printAll(Graphics g)

    (although remember that the parameter is restored to its state immediately after that).

  • Also, I would use the same scaling factor for both dimensions to fit the format.

    double xyRatio = Math.min(pWidth / cWidth, pHeight / cHeight);
    
          

  • Add multiple protocols or System.out.println(String)

    to narrow your problem!



0


source







All Articles