Reputation: 13805
I am Trying to make a swing application here.Now my goal is to print receipt . I have established all details on JPanel. I am trying to print JPanel in java but it prints a blank document.
In JPanel I want to print this: 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;
}
}
Upvotes: 4
Views: 5757
Reputation: 28304
Simple 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;
}
Upvotes: 1
Reputation: 400
Turn off double buffering just before the Component.printAll(Graphics g)
statement (though remember the setting to restore its state just after).
Further, I'd use the same scaling factor for both dimensions to respect the aspect ratio.
double xyRatio = Math.min(pWidth / cWidth, pHeight / cHeight);
Add some logging or System.out.println(String)
statements to narrow-down your issue!
Upvotes: 0