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ãoprivatevoidimprimir(JTabletabela){PrintJobprintJob=gui.getToolkit().getPrintJob(newJFrame(),"",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???
importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.print.PageFormat;importjava.awt.print.Printable;importjava.awt.print.PrinterException;importjava.awt.print.PrinterJob;importjavax.swing.JOptionPane;importjavax.swing.JTable;/** * Classe que imprime uma JTable @author Guilherme I. Keller TODO - Uma melhor explicacao & comentarios. */publicclassImprimirJTableimplementsPrintable{privateJTabletabela;privatePrinterJobprinterJob;privateGraphicsgraphics;privateGraphics2Dgraphics2d;/** * Metodo construtor da classe @param tabela Uma JTable a ser impressa */publicImprimirJTable(JTabletabela){this.tabela=tabela;printerJob=printerJob.getPrinterJob();printerJob.setPrintable(this);printerJob.setJobName("Imprimindo uma JTable");if(printerJob.printDialog()){try{printerJob.print();}catch(PrinterExceptionex){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 */publicintprint(Graphicsg,PageFormatpageFormat,intpageIndex)throwsPrinterException{graphics2d=(Graphics2D)g;graphics2d.setColor(Color.black);intfontHeight=graphics2d.getFontMetrics().getHeight();intfontDesent=graphics2d.getFontMetrics().getDescent();// leave room for page numberdoublepageHeight=pageFormat.getImageableHeight()-fontHeight;doublepageWidth=pageFormat.getImageableWidth();doubletableWidth=(double)tabela.getColumnModel().getTotalColumnWidth();doublescale=1;if(tableWidth>=pageWidth){scale=pageWidth/tableWidth;}doubleheaderHeightOnPage=tabela.getTableHeader().getHeight()*scale;doubletableWidthOnPage=tableWidth*scale;doubleoneRowHeight=(tabela.getRowHeight()+tabela.getRowMargin())*scale;intnumRowsOnAPage=(int)((pageHeight-headerHeightOnPage)/oneRowHeight);doublepageHeightForTable=oneRowHeight*numRowsOnAPage;inttotalNumPages=(int)Math.ceil(((double)tabela.getRowCount())/numRowsOnAPage);if(pageIndex>=totalNumPages){returnNO_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){intlastRowPrinted=numRowsOnAPage*pageIndex;intnumRowsLeft=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 topreturnPrintable.PAGE_EXISTS;// continues printing}}