[英]How to print jpanel in java?
I am Trying to make a swing application here.Now my goal is to print receipt . 我正在尝试在这里制作摇摆应用程序。现在我的目标是打印收据。 I have established all details on JPanel.
我已经建立了JPanel的所有细节。 I am trying to print JPanel in java but it prints a blank document.
我试图在java中打印JPanel,但它打印一个空白文档。
In JPanel I want to print this: 在JPanel中我想打印这个:
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: 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;
}
}
Simple way to print Swing components: 打印Swing组件的简单方法:
/**
* 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;
}
Turn off double buffering just before the Component.printAll(Graphics g)
statement (though remember the setting to restore its state just after). 在
Component.printAll(Graphics g)
语句之前关闭双缓冲(尽管记住刚刚恢复其状态的设置)。
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! 添加一些日志记录或
System.out.println(String)
语句来缩小您的问题范围!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.