Seguendo il tutorial java ho implementato una classe che estende la JTable ed è stampabile; ho però un inconveniente: mentre tento di lanciare la stampa il pc si impalla e il metodo print() entra in un ciclo infinito.
Se cambio il metodo print con un altro di test invece riesco a stampare una stringa, quindi il problema non risiede nell'errata invocazione del metodo.
Sapete come risolvere questo maledetto problema?
Ecco il codice della classe (il metodo print è copiato direttamente dal tutorial consigliato nel post precedente):
codice:
import javax.swing.table.*;
import javax.swing.*;
//Per Stampa
import java.awt.print.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.Dimension;
public class ClientiJTable extends JTable implements Printable{
public ClientiJTable(){
TableModel dataModel = new AbstractTableModel(){
public int getColumnCount(){
return 5;
}
public int getRowCount(){
return 100;
}
public Object getValueAt(int row, int col){
return new Integer(row*col);
}
};
this.setModel(dataModel);
RepaintManager.currentManager(this).setDoubleBufferingEnabled(false);
}
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)this.getColumnModel().getTotalColumnWidth();
double scale = 1;
if (tableWidth >= pageWidth) {
scale = pageWidth / tableWidth;
}
double headerHeightOnPage = this.getTableHeader().getHeight()*scale;
double tableWidthOnPage = tableWidth*scale;
double oneRowHeight = (this.getRowHeight()+this.getRowMargin())*scale;
int numRowsOnAPage = (int)((pageHeight-headerHeightOnPage)/oneRowHeight);
double pageHeightForTable=oneRowHeight*numRowsOnAPage;
int totalNumPages = (int)Math.ceil(((double)this.getRowCount())/numRowsOnAPage);
if(pageIndex>=totalNumPages) {
return NO_SUCH_PAGE;
}
g2.translate(pageFormat.getImageableX(),pageFormat.getImageableY());
//bottom center
g2.drawString("Page: "+(pageIndex+1),(int)pageWidth/2-35,(int)(pageHeight+fontHeight-fontDesent));
g2.translate(0f,headerHeightOnPage);
g2.translate(0f,-pageIndex*pageHeightForTable);
//If this piece of the table is smaller
//than the size available,
//clip to the appropriate bounds.
if (pageIndex + 1 == totalNumPages) {
int lastRowPrinted = numRowsOnAPage * pageIndex;
int numRowsLeft = this.getRowCount() - lastRowPrinted;
g2.setClip(0,(int)(pageHeightForTable * pageIndex),(int) Math.ceil(tableWidthOnPage),(int) Math.ceil(oneRowHeight*numRowsLeft));
}
//else clip to the entire area available.
else{
g2.setClip(0,(int)(pageHeightForTable*pageIndex),(int) Math.ceil(tableWidthOnPage),(int) Math.ceil(pageHeightForTable));
}
g2.scale(scale,scale);
this.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);
this.getTableHeader().paint(g2);
//paint header at top
return Printable.PAGE_EXISTS;
}
/*
public int print(Graphics grap,PageFormat pageFormat, int pageIndex) throws PrinterException{
if(pageIndex > 0)
return NO_SUCH_PAGE;
grap.drawString("Prova di stampa!", (int)pageFormat.getImageableX(),(int)pageFormat.getImageableY()+5);
grap.setColor(Color.blue);
grap.drawLine((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY(),(int)pageFormat.getImageableWidth(),(int)pageFormat.getImageableHeight());
return PAGE_EXISTS;
}
*/
}