impresión de 2 páginas de jframe en java

Me gustaría imprimir un jframe que contenga una gran cantidad de campos de texto y botones que contengan datos. Quiero imprimir este jframe haciendo clic en un botón Imprimir j. He intentado este código.

protected void print() { PrinterJob job = PrinterJob.getPrinterJob(); if(job.printDialog()){ try { job.setPrintable(new Printable() { @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if(pageIndex == 0){ Graphics2D g2d = (Graphics2D)graphics; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); Dimension dim = ODietListJFrame.this.getSize(); double cHeight = dim.getHeight(); double cWidth = dim.getWidth(); // get the bounds of the printable area double pHeight = pageFormat.getImageableHeight(); double pWidth = pageFormat.getImageableWidth(); double xRatio = pWidth / cWidth; double yRatio = pHeight / cHeight; g2d.scale(xRatio, yRatio); ODietListJFrame.this.printAll(g2d); return PAGE_EXISTS; } return NO_SUCH_PAGE; } }); job.print(); } catch (PrinterException e) { e.printStackTrace(); } } else { System.err.println("Error printing"); } 

}

Mi problema es que mi jframe es demasiado grande y debe imprimirse en dos páginas y este código imprime la segunda página. Quiero imprimir la primera parte del jframe.

Gracias por la ayuda.

Entonces, lo primero que debemos hacer es asegurarnos de que el componente que se imprimió tenga el tamaño preferido …

 component.setSize(component.getPreferredSize()); 

Esto es importante, pero también recuerde que esto afectará el componente que está en la pantalla …

A continuación, debemos resolver si estamos imprimiendo una nueva página o volviendo a imprimir la página actual. Esto ocurre porque la print puede ser llamada varias veces para una página determinada …

 if (lastPage != pageIndex) { lastPage = pageIndex; //... } 

Luego tenemos que calcular el desplazamiento y del componente que se ajusta a la página actual …

 yOffset = height * pageIndex; if (yOffset > component.getHeight()) { yOffset = -1; } 

Si yOffset es mayor que la altura del component , entonces no queremos imprimir más páginas.

A continuación, imprimimos la página, para ello, necesitamos traducir el contexto de Graphics para que yOffset convierta en la nueva posición 0

 g2d.translate(0, -yOffset); 

Luego imprimimos el componente …

 component.printAll(g2d); 

Por ejemplo…

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.standard.MediaSizeName; import javax.print.attribute.standard.PrinterResolution; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.Scrollable; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class PrintMe { public static void main(String[] args) { new PrintMe(); } public PrintMe() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } TestPane testPane = new TestPane(); JButton btn = new JButton("Print"); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); aset.add(MediaSizeName.ISO_A4); aset.add(new PrinterResolution(300, 300, PrinterResolution.DPI)); PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPrintable(new MultiPagePrintable(testPane)); if (pj.printDialog(aset)) { try { pj.print(aset); testPane.getParent().invalidate(); testPane.getParent().validate(); } catch (PrinterException ex) { ex.printStackTrace(); } } } }); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JScrollPane(testPane)); frame.add(btn, BorderLayout.SOUTH); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel implements Scrollable { private BufferedImage img; public TestPane() { try { img = ImageIO.read(new File("Get your own image")); } catch (IOException ex) { ex.printStackTrace(); } } @Override public Dimension getPreferredSize() { return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(), img.getHeight()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (img != null) { Graphics2D g2d = (Graphics2D) g.create(); int x = (getWidth() - img.getWidth()) / 2; int y = (getHeight() - img.getHeight()) / 2; g2d.drawImage(img, x, y, this); g2d.dispose(); } } @Override public Dimension getPreferredScrollableViewportSize() { return new Dimension(200, 200); } @Override public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { return 128; } @Override public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return 128; } @Override public boolean getScrollableTracksViewportWidth() { return false; } @Override public boolean getScrollableTracksViewportHeight() { return false; } } public class MultiPagePrintable implements Printable { private JComponent component; private int lastPage = 0; private double yOffset; public MultiPagePrintable(JComponent component) { this.component = component; } @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { int result = NO_SUCH_PAGE; double height = pageFormat.getImageableHeight(); component.setSize(component.getPreferredSize()); if (lastPage != pageIndex) { lastPage = pageIndex; yOffset = height * pageIndex; if (yOffset > component.getHeight()) { yOffset = -1; } } if (yOffset >= 0) { Graphics2D g2d = (Graphics2D) graphics; g2d.translate((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY()); g2d.translate(0, -yOffset); component.printAll(g2d); result = PAGE_EXISTS; } return result; } } } 

Ahora, este ejemplo solo se imprime en la dirección vertical, si también necesita imprimir la dirección horizontal, se vuelve un poco más complicado, pero el concepto básico sigue siendo el mismo