Imprimir JTable

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

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 ?

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:

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

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

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

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???

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

new ImprimirJTable(suaJTable);

beleza ? se nao conseguir só postar…

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

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

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

¿Ninguen sabe?

Oi,

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

Obrigada.
Patty

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

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

Obrigada :slight_smile:

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

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

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

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!!!

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