PDA

Visualizza la versione completa : [JAVA] Stampare JTable


ghinz
22-02-2002, 11:02
Il problema quello di stampare un JTable.
Vorrei dare all'utilizzatore del mio programma la possibilit di visualizzare una anteprima di stampa, impostare margini e intestazioni e pi di pagina, etc...
Per stampare una JTable (soprattutto se di grosse dimensioni) ho visto che c' da scrivere un tot di codice e se voglio anche fare l'anteprima non mi passa pi, devo scrivere troppa roba e non ho tempo.

Dove posso trovare una classe gi fatta per soddisfare questa esigenza?

Ho gi scandagliato il web e ho trovato diverse cose, ma sono tutte a pagamento (salato!).

Qualcuno di voi ha gi affrontato il problema?

Grazie :cry:

ImaNewBie
22-02-2002, 21:10
Up.... ho postato anch'io una richiesta simile un po di tempo fa....

ghinz
25-02-2002, 09:04
ri-UP :D
Siamo in due adesso, aiutateci :cry:

Omar81
29-03-2003, 21:10
se volete siamo in 3!

ghinz
31-03-2003, 08:51
Buongiorno, a suo tempo avevo ravanato un po' in giro per la rete fino a trovare un esempio (non ricordo dove), comunque ti posto la classe che ho ricavato:

import javax.swing.*;
import javax.swing.table.*;

import java.awt.print.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.Dimension;

public class StampaTabella implements Printable {

JFrame frame;
JTable tableView;

public StampaTabella(JTable Tabella) {
tableView = Tabella;
}

public void Stampa() {
PrinterJob pj=PrinterJob.getPrinterJob();
pj.setPrintable(StampaTabella.this);
pj.printDialog();
try{
pj.print();
}
catch (Exception ex) {
ex.printStackTrace();
}
}

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();
//leave room for page number
double pageHeight = pageFormat.getImageableHeight()-fontHeight;
double pageWidth = pageFormat.getImageableWidth();
double tableWidth = (double)tableView.getColumnModel().getTotalColumnW idth();
double scale = 1;
if (tableWidth >= pageWidth) {
scale = pageWidth / tableWidth;
}
double headerHeightOnPage = tableView.getTableHeader().getHeight() * scale;
double tableWidthOnPage = tableWidth * scale;
double oneRowHeight = (tableView.getRowHeight() + tableView.getRowMargin()) * scale;
int numRowsOnAPage = (int)((pageHeight - headerHeightOnPage) / oneRowHeight);
double pageHeightForTable = oneRowHeight * numRowsOnAPage;
int totalNumPages= (int)Math.ceil(((double)tableView.getRowCount()) / numRowsOnAPage);
if(pageIndex>=totalNumPages) {
return NO_SUCH_PAGE;
}
g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
g2.drawString("Page: "+(pageIndex+1),(int)pageWidth/2-35,
(int)(pageHeight+fontHeight-fontDesent));//bottom center

g2.translate(0f,headerHeightOnPage);
g2.translate(0f,-pageIndex*pageHeightForTable);
//TODO this next line treats the last page as a full page
g2.setClip(0, (int)(pageHeightForTable*pageIndex),(int)
Math.ceil(tableWidthOnPage),
(int) Math.ceil(pageHeightForTable));

g2.scale(scale,scale);
tableView.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);
tableView.getTableHeader().paint(g2);//paint header at top
return Printable.PAGE_EXISTS;
}

}
Fatto questo per stampare una jtable scrivo questo:

StampaTabella prn = new StampaTabella(stat); // stat la jtable da stampare
prn.Stampa();
prn = null;
Ci mette un po' comunque pi o meno funziona.
Ciao

d4niela
19-07-2010, 23:44
ciao!!! utilissima la tua classe.. volevo chiederti se possibile stampare eliminando le linee delle tabelle ... :dh: non mi molto chiaro il codice

LeleFT
20-07-2010, 09:09
Originariamente inviato da d4niela
ciao!!! utilissima la tua classe.. volevo chiederti se possibile stampare eliminando le linee delle tabelle ... :dh: non mi molto chiaro il codice
E' una discussione del 2002!!
Come da regolamento interno (http://forum.html.it/forum/showthread.php?s=&threadid=973887), non si risollevano discussioni morte, specialmente se c' un forum dedicato al linguaggio che all'epoca non c'era.

Apri una nuova discussione nel forum Java, eventualmente linkando questa discussione.


Ciao. :ciauz:

Loading