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:
[code]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
}
}
[/code]
-
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!