Download PrintSalesReport.java source file
// Adapted from ??? by Wayne Pollock, Tampa Florida USA.
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 SalesReport extends JApplet implements Printable {
JTable ppTable;
JTableHeader tableHeader;
int [] subTableSplit = null;
boolean pageinfoCalculated=false;
int totalNumPages=0;
int prevPageIndex = 0;
int subPageIndex = 0;
int subTableSplitSize = 0;
double tableHeightOnFullPage, headerHeight;
double pageWidth, pageHeight;
int fontHeight, fontDesent;
double tableHeight, rowHeight;
public void init() {
final String[] headers = {
"Description", "open price", "latest price", "End Date", "Quantity",
"a", "b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"
};
final Object[][] data = {
{"Box of Biros", "1.00", "4.99", new Date(), new Integer(2), "a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"Blue Biro", "0.10", "0.14", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"legal pad", "1.00", "2.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"legal pad", "1.00", "2.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"legal pad", "1.00", "2.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"legal pad", "1.00", "2.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"tape", "1.00", "1.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"stapler", "4.00", "4.49", new Date(), new Integer(1),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"},
{"legal pad", "1.00", "2.29", new Date(), new Integer(5),"a","b", "c", "d", "e", "f", "g", "h", "i","j","k","l","m","n"}
};
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() { return headers.length; }
public int getRowCount() { return data.length;}
public Object getValueAt(int row, int col) {return data[row][col];}
public String getColumnName(int column) {return headers[column];}
public Class getColumnClass(int col) {return getValueAt(0,col).getClass();}
public boolean isCellEditable(int row, int col) {return (col==1);}
public void setValueAt(Object aValue, int row, int column) {
data[row][column] = aValue;
}
};
ppTable = new JTable(dataModel);
JScrollPane scrollpane = new JScrollPane(ppTable);
scrollpane.setPreferredSize(new Dimension(500, 80));
getContentPane().setLayout(new BorderLayout());
getContentPane().add(BorderLayout.CENTER,scrollpane);
JButton printButton= new JButton();
printButton.setText("print me!");
getContentPane().add(BorderLayout.SOUTH,printButton);
// for faster printing turn double buffering off
RepaintManager.currentManager(this).setDoubleBufferingEnabled(false);
printButton.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent evt) {
PrinterJob pj=PrinterJob.getPrinterJob();
pj.setPrintable(SalesReport.this);
pj.printDialog();
try{
pj.print();
}catch (Exception PrintException) {}
}
});
setVisible(true);
}
public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException {
Graphics2D g2=(Graphics2D)g;
if(!pageinfoCalculated) {
getPageInfo(g, pageFormat);
}
g2.setColor(Color.black);
if(pageIndex>=totalNumPages) {
return NO_SUCH_PAGE;
}
if (prevPageIndex != pageIndex) {
subPageIndex++;
if( subPageIndex == subTableSplitSize -1) {
subPageIndex=0;
}
}
g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
int rowIndex = pageIndex/ (subTableSplitSize -1);
printTablePart(g2, pageFormat, rowIndex, subPageIndex);
prevPageIndex= pageIndex;
return Printable.PAGE_EXISTS;
}
public void getPageInfo(Graphics g, PageFormat pageFormat) {
subTableSplit = null;
subTableSplitSize = 0;
subPageIndex = 0;
prevPageIndex = 0;
fontHeight=g.getFontMetrics().getHeight();
fontDesent=g.getFontMetrics().getDescent();
tableHeader = ppTable.getTableHeader();
double headerWidth = tableHeader.getWidth();
headerHeight = tableHeader.getHeight() + ppTable.getRowMargin();
pageHeight = pageFormat.getImageableHeight();
pageWidth = pageFormat.getImageableWidth();
double tableWidth = ppTable.getColumnModel().getTotalColumnWidth();
tableHeight = ppTable.getHeight();
rowHeight = ppTable.getRowHeight() + ppTable.getRowMargin();
tableHeightOnFullPage = (int)(pageHeight - headerHeight - fontHeight*2);
tableHeightOnFullPage = tableHeightOnFullPage/rowHeight * rowHeight;
TableColumnModel tableColumnModel = tableHeader.getColumnModel();
int columns = tableColumnModel.getColumnCount();
int columnMargin = tableColumnModel.getColumnMargin();
int [] temp = new int[columns];
int columnIndex = 0;
temp[0] = 0;
int columnWidth;
int length = 0;
subTableSplitSize = 0;
while ( columnIndex < columns ) {
columnWidth = tableColumnModel.getColumn(columnIndex).getWidth();
if ( length + columnWidth + columnMargin gt; pageWidth ) {
temp[subTableSplitSize+1] = temp[subTableSplitSize] + length;
length = columnWidth;
subTableSplitSize++;
}
else {
length += columnWidth + columnMargin;
}
columnIndex++;
} //while
if ( length gt; 0 ) { // if are more columns left, part page
temp[subTableSplitSize+1] = temp[subTableSplitSize] + length;
subTableSplitSize++;
}
subTableSplitSize++;
subTableSplit = new int[subTableSplitSize];
for ( int i=0; i < subTableSplitSize; i++ ) {
subTableSplit[i]= temp[i];
}
totalNumPages = (int)(tableHeight/tableHeightOnFullPage);
if ( tableHeight%tableHeightOnFullPage gt;= rowHeight ) { // at least 1 more row left
totalNumPages++;
}
totalNumPages *= (subTableSplitSize-1);
pageinfoCalculated = true;
}
public void printTablePart(Graphics2D g2, PageFormat pageFormat, int rowIndex, int columnIndex) {
String pageNumber = "Page: "+(rowIndex+1);
if ( subTableSplitSize gt; 1 ) {
pageNumber += "-" + (columnIndex+1);
}
int pageLeft = subTableSplit[columnIndex];
int pageRight = subTableSplit[columnIndex + 1];
int pageWidth = pageRight-pageLeft;
// page number message
g2.drawString(pageNumber, pageWidth/2-35, (int)(pageHeight - fontHeight));
double clipHeight = Math.min(tableHeightOnFullPage, tableHeight - rowIndex*tableHeightOnFullPage);
g2.translate(-subTableSplit[columnIndex], 0);
g2.setClip(pageLeft ,0, pageWidth, (int)headerHeight);
tableHeader.paint(g2); // draw the header on every page
g2.translate(0, headerHeight);
g2.translate(0, -tableHeightOnFullPage*rowIndex);
// cut table image and draw on the page
g2.setClip(pageLeft, (int)tableHeightOnFullPage*rowIndex, pageWidth, (int)clipHeight);
ppTable.paint(g2);
double pageTop = tableHeightOnFullPage*rowIndex - headerHeight;
double pageBottom = pageTop + clipHeight + headerHeight;
g2.drawRect(pageLeft, (int)pageTop, pageWidth, (int)(clipHeight+ headerHeight));
}
}