Imprimir jTable

Guiomar
18 de Enero del 2009
Yo uso el siguiente código para imprimir un componente jTable:

public int print(Graphics g, PageFormat pageFormat,
int pageIndex) throws PrinterException {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.black);
int fontHeight=g2.getFontMetrics().getHeight();
int fontDesent=g2.getFontMetrics().getDescent();


double pageHeight =
pageFormat.getImageableHeight()-fontHeight;
double pageWidth =
pageFormat.getImageableWidth();
double tableWidth = (double)
MaterialesTable.getColumnModel(
).getTotalColumnWidth();
double scale = 1;
if (tableWidth >= pageWidth) {
scale = pageWidth / tableWidth;
}

double headerHeightOnPage=
MaterialesTable.getTableHeader(
).getHeight()*scale;
double tableWidthOnPage=tableWidth*scale;

double oneRowHeight=(MaterialesTable.getRowHeight()+
MaterialesTable.getRowMargin())*scale;
int numRowsOnAPage=
(int)((pageHeight-headerHeightOnPage)/
oneRowHeight);
double pageHeightForTable=oneRowHeight*
numRowsOnAPage;
int totalNumPages=
(int)Math.ceil((
(double)MaterialesTable.getRowCount())/
numRowsOnAPage);
if(pageIndex>=totalNumPages) {
return NO_SUCH_PAGE;
}

g2.translate(pageFormat.getImageableX(),
pageFormat.getImageableY());

g2.drawString("Página: "+(pageIndex+1),
(int)pageWidth/2-35, (int)(pageHeight
+fontHeight-fontDesent));

g2.translate(0f,headerHeightOnPage);
g2.translate(0f,-pageIndex*pageHeightForTable);


if (pageIndex + 1 == totalNumPages) {
int lastRowPrinted =
numRowsOnAPage * pageIndex;
int numRowsLeft =
MaterialesTable.getRowCount()
- lastRowPrinted;
g2.setClip(0,
(int)(pageHeightForTable * pageIndex),
(int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(oneRowHeight *
numRowsLeft));
}

else{
g2.setClip(0,
(int)(pageHeightForTable*pageIndex),
(int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(pageHeightForTable));
}

g2.scale(scale,scale);
MaterialesTable.paint(g2);
g2.scale(1/scale,1/scale);
g2.translate(0f,pageIndex*pageHeightForTable);
g2.translate(0f, -headerHeightOnPage);
g2.setClip(0, 0,
(int) Math.ceil(tableWidthOnPage),
(int)Math.ceil(headerHeightOnPage));
g2.scale(scale,scale);
MaterialesTable.getTableHeader().paint(g2);



return Printable.PAGE_EXISTS;
}

Funciona perfectamente, pero el problema que tengo es que me gustaría imprimir una cabecera al principio y no soy capaz. Si alguién puede ayudarme. Gracias.

lechuky
18 de Enero del 2009
perdona yo estoy intentando imprimir una tabla y he intentado usar el código que has puesto pero no me funciona me lo podrías esplicar un poco??,
a mi me habían dicho que utilizara el método tabla.printAll(grafico)
pero no me funciona tampoco, ya me parecía a mi muy fácil, si puedes hecharme una mano te estaría muy agradecido. Gracias

Guiomar
18 de Enero del 2009
Hola, prueba lo siguiente:
copias el código anterior, que es una función para imprimir. Donde pongo yo MaterialesTable, tú tienes que poner el nombre de la jTable que quieres imprimir.
Y despues pones un botón imprimir que cuando lo pulsen realize la siguientes acciones:

private void ImprimirButtonMouseClicked(java.awt.event.MouseEvent evt) {
PrinterJob pj=PrinterJob.getPrinterJob();
pj.setPrintable(ConsultarMateriales.this);
pj.printDialog();
try{
pj.print();
}catch (Exception PrintException) {}
}
Donde yo pongo "ConsultarMateriales.this" tienes que poner el nombre de la clase que contiene todo este código.this.

Ahh se me olvidaba que tambien tienes que poner que la clase qeu contiene este código implementa Printable:
implements Printable

Y tambien tienes que importar:
import java.awt.print.*;

Así te debería funcionar para una tabla sencilla, si tienes algún problema pues me comentas.

Mario
18 de Enero del 2009
Hola por fa yo tambien estoy intentando hacer eso y no he podido porfa ayudaneme ojala envieme el código al correo por que ya probe ese codigo y tambien solo lo que logro es que imprima la tabla pero con un titulo porfa AYUDAAAAAAAAA