impressão de um JTable [RESOLVIDO]

11 respostas
W

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.

11 Respostas

mauricioadl
PageFormat pf = pj.defaultPage();

Paper paper = new Paper();

double margin = 36; // half inch

paper.setImageableArea(margin, margin, paper.getWidth() - margin * 2, paper.getHeight()

- margin * 2);

pf.setPaper(paper);
W
<blockquote><div class="quote-author">mauricioadl:</div>PageFormat pf = pj.defaultPage();

Paper paper = new Paper();

double margin = 36; // half inch

paper.setImageableArea(margin, margin, paper.getWidth() - margin * 2, paper.getHeight()

- margin * 2);

pf.setPaper(paper);</blockquote>

Amigo, onde eu colocaria esse código?

E

O código que lhe repassaram tem uma variável “pj” cujo tipo é “PrinterJob”.

W

Desculpa insistir mas to iniciando e não consegui resolver. Segue o código com a informação que vcs me passaram aí identificada por ///////////////////
Mas isso não funcionou, a impressão continua do mesmo jeito.

Onde estou errando?

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);
                Paper paper = new Paper(); //////////////////////////////////////////////////////////////////////////////////////////////////////////////// AQUI
                paper.setImageableArea(36,36,paper.getWidth() - 36 * 2, paper.getHeight() - 36 * 2); //////////////////////////////////////////// AQUI
                printerJob.defaultPage().setPaper(paper); /////////////////////////////////////////////////////////////////////////////////////////////// E AQUI
		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;
	}
}
E

O Eklcilipse não deu um erro de compilação na linha que contém essa palavra aqui?

getWitdth

Quando o Eklclkiliopse encontra um erro de compilação, ele gera o pacote assim mesmo, e você acaba só descobrindo o problema em tempo de execução.

W

entanglement:
O Eklcilipse não deu um erro de compilação na linha que contém essa palavra aqui?

getWidth

Quando o Eklclkiliopse encontra um erro de compilação, ele gera o pacote assim mesmo, e você acaba só descobrindo o problema em tempo de execução.

Eu só tinha digitado errado aqui. É que eu tava olhando no meu note e digitando no fórum de outra máquina. Mas já corrigi ali.

Meu problema continua!

.

lucasportela

Espero que este exemplo lhe ajude:

https://sites.google.com/site/lucasportela/home/java/imprimirtelapelojava

W
<blockquote><div class="quote-author">mauricioadl:</div>PageFormat pf = pj.defaultPage();

Paper paper = new Paper();

double margin = 36; // half inch

paper.setImageableArea(margin, margin, paper.getWidth() - margin * 2, paper.getHeight()

- margin * 2);

pf.setPaper(paper);</blockquote>

Maurício, coloquei esse código e continua imprimindo na pagina inteira sem margem.

Será que to fazendo algo errado?

mauricioadl

cara, nao sei se vc pode fazer, mas no meu trampo sempre teve problemas com impressao, isso com todas as linguagens q usam lah. delphi flex pl/sql java. pra resovler de uma vez por todos, tudo que precisa ser impresso utiliza-se o jasper reports da um pouco de trabalho a mais, mas vale a pena, os clientes adoram o formato dos relatorios e possibilita imprimir em qlqer tipo de impressora. pode ser uma alternativa ao seu problema e a problemas futuros

oq vc acha?

A
<blockquote><div class="quote-author">wellingtonfoz:</div><blockquote><div class="quote-author">mauricioadl:</div>PageFormat pf = pj.defaultPage();

Paper paper = new Paper();

double margin = 36; // half inch

paper.setImageableArea(margin, margin, paper.getWidth() - margin * 2, paper.getHeight()

- margin * 2);

pf.setPaper(paper);</blockquote>

Amigo, onde eu colocaria esse código?

Coloca o código dentro do construtor da classe.

Exemplo:

public ImprimeJTable(JTable tabela) {

        this.tabela = tabela;

        printerJob = printerJob.getPrinterJob();
        
        PageFormat pf = printerJob.defaultPage();
        Paper paper = new Paper();
        double margin = 50; // half inch
        paper.setImageableArea(margin, margin, paper.getWidth() - margin * 2, paper.getHeight()- margin * 2);
        pf.setPaper(paper);
        printerJob.setPrintable(this, pf);

        if (printerJob.printDialog()) {
            try {
                printerJob.print();
            } catch (PrinterException ex) {
                JOptionPane.showMessageDialog(null,
                        "Ocorreu um erro durante a impressão. \n" + ex.toString(),
                        "Erro do Sistema",
                        JOptionPane.ERROR_MESSAGE);
            }
        }
    }
A

Esta forma de imprimir uma jTable não funciona muito bem, pois ela não desenha a jTable de uma forma perfeita e quando existe mais do que uma página a transição de página também não é perfeita.

O método print() da jTable funciona melhor. É pena estar em inglês (se alguém souber como efectuar a sua tradução, por favor, informe).

MessageFormat titulo = new MessageFormat("Listagem da Tabela\n");//Imprime um Titulo no cabeçalho da página.
            MessageFormat numeroPaginas = new MessageFormat("Pagina - {0,number,integer}");//Imprime o numero de página no rodapé de cada página.

            try {
                // Imprime o coteudo da "jTable1":
                jTable1.print(JTable.PrintMode.FIT_WIDTH, titulo, numeroPaginas);

            } catch (java.awt.print.PrinterException ex) {
                JOptionPane.showMessageDialog(this, "Erro de impressão: " + ex.getMessage(), "Erro de impressão", JOptionPane.ERROR_MESSAGE);
            }
Criado 10 de agosto de 2011
Ultima resposta 17 de ago. de 2013
Respostas 11
Participantes 5