Problemas ao imprimir

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!