Olá galera. Peguei esse código de impressão de uma JTable que distribuiram aqui no fórum.
A impressão fica direitinho e muda de página quando está no fim da página tudo certim. O único problema é que a impressão ocupa 100% da página e não tem margens nem superior, inferior ou dos lados. Alguém poderia me dizer como eu faria pra por uma margem aí.
Agradeço!
package br.edu.anglo.EMS.Util;
import java.awt.Color;
// Classe para impressão de JTables.
// Esse código foi copiado do fórum GUJ do autor abaixo:
/*** Classe que imprime uma JTable
@author Guilherme I. Keller
TODO - Uma melhor explicacao & comentarios.*/
public class ImpressaoJTable implements Printable{
private JTable tabela;
private PrinterJob printerJob;
private Graphics2D graphics2d;
public ImpressaoJTable(JTable tabela){
this.tabela = tabela;
printerJob = PrinterJob.getPrinterJob();
printerJob.setPrintable(this);
printerJob.setJobName("JLABRO - Impressão");
if (printerJob.printDialog())
{
try
{
printerJob.print();
}
catch (PrinterException ex)
{
JOptionPane.showMessageDialog(null,"Ocorreu um erro durante a impressão!");
}
}
}
public int print(Graphics g, PageFormat pageFormat, int pageIndex)throws PrinterException{
graphics2d = (Graphics2D) g;
graphics2d.setColor(Color.black);
int fontHeight = graphics2d.getFontMetrics().getHeight();
double pageHeight = pageFormat.getImageableHeight()-fontHeight;
double pageWidth = pageFormat.getImageableWidth();
double tableWidth = (double)tabela.getColumnModel().getTotalColumnWidth();
double scale = 1;
if (tableWidth >= pageWidth){
scale = pageWidth / tableWidth;
}
double headerHeightOnPage = tabela.getTableHeader().getHeight()*scale;
double tableWidthOnPage = tableWidth*scale;
double oneRowHeight =(tabela.getRowHeight()+ tabela.getRowMargin())*scale;
int numRowsOnAPage =(int)((pageHeight-headerHeightOnPage)/oneRowHeight);
double pageHeightForTable = oneRowHeight*numRowsOnAPage;
int totalNumPages = (int)Math.ceil( ( (double)tabela.getRowCount() ) / numRowsOnAPage);
if (pageIndex >= totalNumPages)
return NO_SUCH_PAGE;
graphics2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
graphics2d.translate(0f, headerHeightOnPage);
graphics2d.translate(0f, -pageIndex*pageHeightForTable);
if (pageIndex + 1 == totalNumPages){
int lastRowPrinted = numRowsOnAPage * pageIndex;
int numRowsLeft = tabela.getRowCount() - lastRowPrinted;
graphics2d.setClip( 0, (int) (pageHeightForTable * pageIndex),
(int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(oneRowHeight * numRowsLeft) );
}
else{
graphics2d.setClip( 0, (int) (pageHeightForTable*pageIndex),
(int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(pageHeightForTable) );
}
graphics2d.scale(scale, scale);
tabela.paint(graphics2d);
graphics2d.scale(1 / scale, 1 / scale);
graphics2d.translate(0f, pageIndex * pageHeightForTable);
graphics2d.translate( 0f, -headerHeightOnPage);
graphics2d.setClip( 0, 0, (int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(headerHeightOnPage) );
graphics2d.scale(scale, scale );
tabela.getTableHeader().paint(graphics2d);
return Printable.PAGE_EXISTS;
}
}
========================
DESISTI DE TENTAR CONSERTAR A CLASSE E PASSEI ALGUM TEMPO MONTANDO UM RELATÓRIO COM O IREPORT.