Olá pessoal,
Sou iniciante em Java e preciso de uma maozinha.
Aqui onde trabalho, utilizamos os componentes JIDE. O problema ocorre quando tento imprimir uma AggregateTable.
Esse componente na verdade é como se fosse a junção de duas JTabels.
Obiviamente quero imprimir os dados expandidos. Utilizando uma classe que encontrei na net para impressão de uma JTable, fiz a seguinte:
package util;
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 com.jidesoft.pivot.AggregateTablePane;
/**
* Classe que imprime uma JTable
*
* @author Guilherme I. Keller TODO - Uma melhor explicacao & comentarios.
*/
public class PrintJTable implements Printable {
private AggregateTablePane tabela;
private PrinterJob printerJob;
private Graphics graphics;
private Graphics2D graphics2d;
/**
* Metodo construtor da classe
*
* @param tabela
* Uma JTable a ser impressa
* @return
*/
public void ImprimirJTable(AggregateTablePane 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();
double pageHeight = pageFormat.getImageableHeight() - fontHeight;
double pageWidth = pageFormat.getImageableWidth();
double tableWidth = (double) tabela.getMainTable().getColumnModel()
.getTotalColumnWidth()
+ tabela.getRowHeaderTable().getColumnModel()
.getTotalColumnWidth();
double mainTableWidth = (double) tabela.getMainTable().getColumnModel()
.getTotalColumnWidth();
double headerTableWidth = (double) tabela.getRowHeaderTable()
.getColumnModel().getTotalColumnWidth();
double scale = 1;
if (tableWidth >= pageWidth) {
scale = pageWidth / tableWidth;
}
/** Header */
double headerHeightOnPage = tabela.getRowHeaderTable().getTableHeader()
.getHeight()
* scale;
double tableWidthOnPage = headerTableWidth * scale;
double oneRowHeight = (tabela.getRowHeaderTable().getRowHeight() + tabela
.getRowHeaderTable().getRowMargin())
* scale;
int numRowsOnAPage = (int) Math
.floor(((pageHeight - headerHeightOnPage) / oneRowHeight));
double pageHeightForTable = oneRowHeight * numRowsOnAPage + 2
* tabela.getRowHeaderTable().getRowMargin();
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 (pageIndex + 1 == totalNumPages) {
int lastRowPrinted = numRowsOnAPage * pageIndex;
int numRowsLeft = tabela.getRowCount() - lastRowPrinted;
graphics2d.setClip(0, (int) Math
.ceil(((pageHeightForTable) * pageIndex)), (int) Math
.ceil(tableWidthOnPage), (int) Math.ceil(oneRowHeight
* numRowsLeft));
}
// else clip to the entire area available.
else {
graphics2d.setClip(0, (int) Math
.ceil(((pageHeightForTable) * pageIndex)), (int) Math
.ceil(tableWidthOnPage), (int) Math
.floor(pageHeightForTable));
}
graphics2d.scale(scale, scale);
tabela.getRowHeaderTable().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.getRowHeaderTable().getTableHeader().paint(graphics2d); //
graphics2d.scale(1 / scale, 1 / scale);
/** Main */
graphics2d = null;
graphics2d = (Graphics2D) g;
graphics2d.setColor(Color.black);
tableWidthOnPage = mainTableWidth * scale;
graphics2d.translate(pageFormat.getImageableX(), pageFormat
.getImageableY());
graphics2d.translate(0f, headerHeightOnPage);
graphics2d.translate(tabela.getRowHeaderTable().getWidth() * scale,
-pageIndex * pageHeightForTable);
graphics2d.setClip(0, (int) (pageHeightForTable * pageIndex),
(int) tableWidthOnPage, (int) pageHeightForTable);
// }
graphics2d.scale(scale, scale);
tabela.getMainTable().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.getMainTable().getTableHeader().paint(graphics2d);
return Printable.PAGE_EXISTS; // continues printing
}
}
O que faço então, é imprimir uma tabela ao lado da outra(já que o componente tem duas tabelas). Porém quando imprimo na impressora, as tabelas saem desalinhadas.
Talvez eu esteja fazendo algo banal de maneira errada. Provavelmente com o Graphics(que não sei utilizar direito).
A classe está mal estruturada, e sem comentários. Vou tentar comendar e postar daqui a pouco.
Obrigado!