impressão com printJob [RESOLVIDO]

1 resposta
W

Olá pessoal,
Desculpa tantas perguntas, é que estou com um projeto pra entregar na faculdade e faltam alguns detalhes.

Tenho um método beeeeem simples pra imprimir uma JTable:

// Método para impressão
	private void imprimir(JTable tabela) {
		PrintJob printJob = gui.getToolkit().getPrintJob(new JFrame(),"",null); 
		if (printJob    !=  null){   
			tabela.print(printJob.getGraphics());  
			printJob.end();  
		}			
	}

Até funciona, mas se a JTable tem largura muito grande ele imprime tipo truncando uma parte.
Alguém sabe como faço para tipo formatar a impressão? Caso for ultrapassar, então jogar conteúdo pra baixo… tipo algo assim???

Obrigado

1 Resposta

W
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
        }
}
Criado 11 de junho de 2011
Ultima resposta 16 de jun. de 2011
Respostas 1
Participantes 1