Problemas ao imprimir

0 respostas
X

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!

Criado 2 de abril de 2009
Respostas 0
Participantes 1