控制打印页面上面板的大小

我想用两张桌子打印jpanel。 我遇到的两个问题,第一个是印刷图像的准确性不是很好。 第二个我怎样才能控制打印页面上jpanel的大小?

这是使用xps查看器打印页面的图像(准确性不好) 在此处输入图像描述

是否有精确的打印图像 在此处输入图像描述 喜欢这个

这是代码:

PrinterJob printjob = PrinterJob.getPrinterJob(); printjob.setJobName(" TESSCO CUSTOMER CARD "); Printable printable = new Printable() { public int print(Graphics pg, PageFormat pf, int pageNum) { if (pageNum > 0) { return Printable.NO_SUCH_PAGE; } Dimension size = jPanel1.getSize(); BufferedImage bufferedImage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB); jPanel1.print(bufferedImage.getGraphics()); Graphics2D g2 = (Graphics2D) pg; g2.translate(pf.getImageableX(), pf.getImageableY()); g2.drawImage(bufferedImage, 0, 0, (int) pf.getWidth(), (int) pf.getHeight(), null); return Printable.PAGE_EXISTS; } }; Paper paper = new Paper(); paper.setImageableArea(0, 0,700,890); paper.setSize(700,890); PageFormat format = new PageFormat(); format.setPaper(paper); format.setOrientation(PageFormat.LANDSCAPE); printjob.setPrintable(printable, format); if (printjob.printDialog() == false) return; try { printjob.print(); } catch (PrinterException ex) { System.out.println("NO PAGE FOUND." + ex); } 

首先,不要使用窗格大小,您需要充当布局管理器并调整面板大小以适合页面。

其次,不要使用缓冲图像。 这将不会与打印引擎过去的图形上下文共享相同的属性。 此外,另一种打印方法是可重入的,这意味着它可能会为每个页面调用多次,以这种方式创建缓冲图像会浪费资源

您可能想看看如何打印表格

UPDATE

你可以做点什么……

 public int print(Graphics pg, PageFormat pf, int pageNum) { if (page > 0) { return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D)pg; double pageWidth = pf.getImageableWidth(); double pageHeight = pf.getImageableHeight(); double pageX = pf.getImageableX(); double pageY = pf.getImageableY(); g2d.translate(pageX, pageY); double tableHeight = pageHeight / 2d; jPanel1.setBounds(0, 0, (int)Math.floor(pageWidth), (int)Math.floor(pageHeight)); jPanel1.printAll(g2d); return Printable.PAGE_EXISTS; } 

请注意,这可能会截断您的表。 此外,您不应该使用屏幕上已有的Component执行此操作。 您应该创建一个新的“打印”组件。

用工作示例更新

好的,所以概念是合理的,只需要一些调整就可以使它工作;)

在此处输入图像描述

 public class PrintTableTest { public static void main(String[] args) { final JTable table1 = new JTable(new AbstractTableModel() { @Override public int getRowCount() { return 3; } @Override public int getColumnCount() { return 3; } @Override public String getColumnName(int column) { String name = null; switch (column) { case 0: name = "Day"; break; case 1: name = "FirstName"; break; case 2: name = "LastName"; break; } return name; } @Override public Object getValueAt(int rowIndex, int columnIndex) { Object value = null; switch (columnIndex) { case 0: switch (rowIndex) { case 0: value = "First"; break; case 1: value = "Second"; break; case 2: value = "Final"; break; } break; } return value; } }); int rowHeight = (int) Math.floor(((700f / 2f) - table1.getTableHeader().getPreferredSize().height) / 3f); table1.setRowHeight(rowHeight); PrinterJob printjob = PrinterJob.getPrinterJob(); printjob.setJobName(" TESSCO CUSTOMER CARD "); Printable printable; printable = new Printable() { public int print(Graphics pg, PageFormat pf, int pageNum) { if (pageNum > 0) { return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) pg; double pageWidth = pf.getImageableWidth(); double pageHeight = pf.getImageableHeight(); double pageX = pf.getImageableX(); double pageY = pf.getImageableY(); g2d.translate(pageX, pageY); // Each table will take half the page... double tableHeight = pageHeight / 2d; // We need to print the header as well... JTableHeader header = table1.getTableHeader(); int headerHeight = header.getPreferredSize().height; int yOffset = 0; for (int index = 0; index < 2; index++) { // Set the bounds of the components // The yOffset is actuall irrelevent to us, but for consitency sake // we'll keep it. header.setBounds(0, yOffset, (int) Math.floor(pageWidth), headerHeight); table1.setBounds(0, yOffset + headerHeight, (int) Math.floor(pageWidth), (int) Math.floor(tableHeight)); // Force the components to update there internal layouts to match // the new size. We need to do this because, technically, we're not // attached to any peer, nor do we want them to be taking into account // the dimensions of any parent any way :P table1.doLayout(); header.doLayout(); // Translate the graphics. Components asume a position of 0x0 when // painting. This is a side effect of the AWT/Swing painting engine // (for which we are greatful), but we need to simulate the change g2d.translate(0, yOffset); header.printAll(g2d); // Translations are relative to the last translation... g2d.translate(0, headerHeight); table1.printAll(g2d); // Reset the last translation g2d.translate(0, -(headerHeight + yOffset)); // Next table... yOffset += table1.getHeight(); } return Printable.PAGE_EXISTS; } }; Paper paper = new Paper(); paper.setImageableArea(0, 0, 700, 890); paper.setSize(700, 890); PageFormat format = new PageFormat(); format.setPaper(paper); format.setOrientation(PageFormat.LANDSCAPE); // printjob.setPrintable(printable, format); BufferedImage img = new BufferedImage(890, 700, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = img.createGraphics(); g2d.setColor(Color.WHITE); g2d.fill(new Rectangle(0, 0, 890, 700)); try { printable.print(g2d, format, 0); } catch (Exception exp) { exp.printStackTrace(); } g2d.dispose(); try { ImageIO.write(img, "png", new File("Print.png")); } catch (IOException ex) { ex.printStackTrace(); } } }