Imprimir JTable

30 respostas
K

boa tarde a todos, alguem sabe se é possivel imprimir uma JTable ?
se alguem tiver link’s ou exemplos são bem vindos, valeu!

30 Respostas

K

consegui imprimir uma JTable segue como fiz…

import 		java.awt.Frame;
import		java.awt.Graphics;
import		java.awt.PrintJob;
import		java.awt.Toolkit;

import		javax.swing.JTable;

public
class		ImprimirJTable{
        
        private		Frame
        frame;
        
        private		Toolkit 
        toolKit;
        
        private		PrintJob
        printJob;
        
        private		Graphics 
        graphics;
        
        public		ImprimirJTable(JTable	ao_tabela){
                
                frame		=	new	Frame();
                
                toolKit		=	frame.getToolkit();                			

                printJob	=	toolKit.getPrintJob(	frame,
                                				"",
                                				null
                                				);
                
                if (printJob	!=	null){ 
                        graphics	=	printJob.getGraphics();
                        ao_tabela.print(graphics);
                        printJob.end();
                }
                frame.dispose();
        }
}

mas a impressao sai errada, a primeira linha sai cortada no meio…
alguem já passou por isso ? alguma solução ?

K

acabei descobrindo que o problema esta no tamanho que a tabela é impressa ela sai muito grande disproporcional a folha, se alguem por ventura :lol: saber como se arruma isso da uma luz :idea: ae… :smiley:

L

A classe JTable do J2SE 1.5 vem com um novo método print() (sobrecarregado) para imprimir… veja na API! :smiley:

K

ainda usamos J2SDK 1.4 aqui na empresa, mas valeu a intenção… :slight_smile:
*continuo sem uma solução…

K

consegui! :lol: após uma noite de sono e uma boa procurada no google consegui um exemplo de AdvancedPrinting e imprimi a JTable!

agradeço a todos que pelo menos olharam o topico, com a intenção de tentar ajudar… :smiley:

import 		java.awt.Color;
import		java.awt.Graphics;
import 		java.awt.Graphics2D;
import 		java.awt.print.PageFormat;
import 		java.awt.print.Printable;
import 		java.awt.print.PrinterException;
import 		java.awt.print.PrinterJob;

import 		javax.swing.JOptionPane;
import		javax.swing.JTable;

/**
 * Classe que imprime uma JTable
 @author	Guilherme I. Keller
 TODO - Uma melhor explicacao & comentarios.
 */
public
class		ImprimirJTable
implements	Printable{
        
        private		JTable
        tabela;
        
        private		PrinterJob
        printerJob;
        
        private		Graphics
        graphics;
        
        private		Graphics2D
        graphics2d;
        
        /**
         * Metodo construtor da classe
         @param		tabela
         		Uma JTable a ser impressa
         */
        public		ImprimirJTable(JTable	tabela){
               
                this.tabela	=	tabela;
                
                printerJob	=	printerJob.getPrinterJob();
                printerJob.setPrintable(this);
                printerJob.setJobName("Imprimindo uma JTable");
                
                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
	                                        			);
	                }
                }
        }
        
        /**
         * Metodo responsavel pela impressao da JTable
         */
        public 
        int 		print(	Graphics g,
                        		PageFormat pageFormat,
                        		int pageIndex
                        	)
        				throws	PrinterException{
                
                	graphics2d		=	(Graphics2D)	g;
                	graphics2d.setColor(Color.black);
             	
            	int 
             	fontHeight		=	graphics2d.getFontMetrics().getHeight();
             	
      	      	int 
             	fontDesent		=	graphics2d.getFontMetrics().getDescent();

             	// leave room for page number
             	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;	//No more pages
             	}

             	graphics2d.translate(	pageFormat.getImageableX(),
             	                		pageFormat.getImageableY()
             	                		);
             	
             	graphics2d.translate(	0f,
             	                		headerHeightOnPage
             	                		);
             	
             	graphics2d.translate(	0f,
             	                		-pageIndex*pageHeightForTable
             	                		);

             	// If this piece of the table is smaller than the size available,
             	// clip to the appropriate bounds.
             	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 clip to the entire area available.
             	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);	// paint header at top

             	return Printable.PAGE_EXISTS;		// continues printing
        }
}
  • tá faltando fazer os comentarios e tal mas o mais importante ela já faz… []'s
A

Mas como faço quando eu crio um objeto desta classe, e tento mandar imprimir ele diz que o método ImprimirJTable(passo uma JTable) não existe… e Ai???

K

faça um botao que no clique dele vc faz…

new ImprimirJTable(suaJTable);

beleza ? se nao conseguir só postar…

K

aleeeee topico de numero 300! o mais novo JavaEvangelist! :lol:

R

Olá,

Alguém poderia me ajudar? Esse código funcionou perfeitamente, porém ao invés de diminuir a escala para enquadrar a tabela numa folha, eu preciso que ocorra a paginação para os lados…

Alguém sabe como fazer isso?

Abraços,
Rodnei Couto

M

Moitas gracias, o método funciona moi ben, pero ¿como podo facer para conseguir unha marxen na parte superior do papel? (quero deixar un espazo para o logotipo da empresa)

Moitas gracias

P.D.: Son español, perdoade o meu mal idioma

M

¿Ninguen sabe?

P

Oi,

Sua classe que imprime Jtable e achei perfeita.
Eu preciso escrever algumas palavras antes da Jtable. Como eu faço isso?

Obrigada.
Patty

I

Como assim “Antes” da JTable?
Cria um JPanel e adiciona um Label antes ué?Explica mellhr se for o caso…

P

Na impressão deve estar a Jtable e algumas palavras antes (data do dia da impressao). Entendeu?

Obrigada :slight_smile:

I
Se for antes da impressão, vc terá que criar um Label mesmo, e adicionar ao seu componente, mas se for na impressão, eu sugiro a vc criar uma string que servirá de Cabeçalho que deve ser passada ao método drawString dentro do método print.Algo mais ou - assim:



Graphics2D g2=(Graphics2D) graphics;

String s="RELATÓRIO DE MUTRETAS DO CONGRESSO NACIONAL"

g2.drawString(s,coluna,10);

s= Núm Data  Valor Vencimento   ;

g2.drawString(s,coluna,50);

s=___  ___ ____ ____;

g2.drawString(s,coluna,65);

//faz busca, preenche componentes blbalbla

return Printable.PAGE_EXISTS;

Acho melhor vc dar uma olhada nessa página que possui vários exemplos:
http://www.java2s.com/ExampleCode/2D-Graphics-GUI/PrintinJava2PrinterJob.htm

P

Vi o que postou mas na verdade não sei nada sobre isso e por isso não consegui fazer.

As palavras são para estar como cabeçalho na impressão da JTable

Se puder me ajudem

Obrigada

T

Bom dia

eu ja utlizo este codigo a um tempinho
porem me ocorreu a mesma necessidade da patty, preciso imprimir na folha, uma string antes da jtable.
Algueim sabe como posso alterar isso?

obrigado

R

keller você é o cara! Tava num fosso e pirando com isso, olhei o primeiro código fonte tão fácil que chega a dá raiva, vou olhar o segundo e acredito que vou conseguir desenrolar; o ruim é que não tem um livro que fale em detalhes sobre o assunto.

Valeu!!!

R

Só falta desenrolar o assunto de JTextArea para impressão…

R

keller, vlw mesmo. como o cara aki de cima eu tb tava quebrando a cabeça pra conseguir imprimir um JTextPane porque quando eu fazia.

g.drawString(doc.getText(0, doc.getLength()), 100, 100);

pq esse doc.getText pegava todo o texto sem espaçamento algum, e imprimia-o na mesma linha tb,

antes eu jah havia tentado imprimir um JTable, mas eu estava conseguindo imprimir apenas o JPanel com tudo dentro inclusive o botão imprimir.

muito obrigado, vlw mesmo

Com o livro do Deitel não consegui nem chegar perto de imprimir

C

Olá, quero apenas agradecer, pois achei através do google este tópico que me ajudou bastante, parabéns pela contribuição da sabedoria um abraço

D

O código ta bom, só que no meu caso ele só tira uma impressão, depois ele fica dando erro, mesmo se eu fechar e abrir o aplicativo denovo

F

não consegui adicionar o cabeçalho, tem como me mostrar código dessa implementação?

K

Uhmn esse codigo é velho!
Fico feliz de saber que ajudou alguns…

Vou ver se pego um tempo pra fazer isso de cabeçalho, isso seria apenas na primeira folha certo?

Vou ver se faco agora pelo fim de semana, nada garantido, valeu pelos comentarios…

Até mais… :thumbup:

W

keller:
boa tarde a todos, alguem sabe se é possivel imprimir uma JTable ?
se alguem tiver link’s ou exemplos são bem vindos, valeu!

Kaaara,
Tua classe é show mesmo kara!
Eu estava com exatamente o mesmo problema.

Muito obrigado mesmo!

Por acaso, tu sabes como faço pra deixar uma margem na impressão? pelo menos um centímetro pra cada lado??
Sabe também como faço pra inserir um texto no cabeçalho e outro no rodapé???

M

Boa tarde! estou com uma pequena duvida na qual não consegui resolver, usei o codigo a cima para imprimir uma tabela, porem em um mesmo frame eu tenho 2 tabelas que quero imprimir, como faço pra sair na mesma impressão as duas tabelas?

no action do botão coloquei o codigo que foi dito a cima também:

new ImprimirJTable(tabela);

funciona beleza, mas gostaria de imprimir as duas, alguem tem alguma dica?

A
A

keller:
faça um botao que no clique dele vc faz…

new ImprimirJTable(suaJTable);

beleza ? se nao conseguir só postar…

Primeiro, ótimo post! Salvou minha vida, exceto por uma coisa:

Quando eu imprimo a minha tabela, os espaços entre as palavras somem, assim:

Original
FULANO DE TAL DA SILVA
Impresso
FULANODETALDASILVA

Alguma luz? =/

Obrigado

A

Como faço para mudar o tamanho da fonte e deixar mais espaços nas laterais, no cabeçalho e rodapé? achei muito massa essa classe para impressão
só precisaria saber com fazer para fazer essas alterações. fico no aguardos.

M

é uma duvida que tive e o que me ajudou foi utilizar o iReport

http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/

Achei esse tutorial bem robusto, espero que ajude como me ajudou.

Criado 25 de novembro de 2004
Ultima resposta 19 de fev. de 2013
Respostas 30
Participantes 18