import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import java.awt.print.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.imageio.*;
public class JTables2 implements ActionListener
{
JFrame fr = new JFrame ("Frame");
JButton Button12 = new JButton("Print");
DefaultTableModel TableModel1 = new DefaultTableModel(20, 30);
//The below command line sets the table model to the JTable
JTable Table1 = new JTable(TableModel1);
JScrollPane ScrollPane1 = new JScrollPane(Table1, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
Dimension Size1 = new Dimension();
PrinterJob prnJob;
PageFormat format;
public void initialize ()
{
Container pane = fr.getContentPane();
pane.setLayout(new FlowLayout());
fr.setSize(250,300);
fr.setLocation(300,300);
fr.setBackground(Color.lightGray);
//The below command line must be set to false so that user
//resizing is allowed
Table1.setAutoCreateColumnsFromModel(false);
Size1.width = 350;
Size1.height = 250;
ScrollPane1.setPreferredSize(Size1);
Table1.setModel(TableModel1);
Table1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
Table1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
pane.add(ScrollPane1);
pane.add(Button12);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Button12.addActionListener(this);
fr.pack();
fr.setVisible(true);
}
public void printData ()
{
//This function prints the contents of the JTable
StyledTextTableRenderer2 StyledTextTableRenderer1 = new StyledTextTableRenderer2();
StyledTextTableRenderer1.settable(Table1);
try
{
//The below command line gets the printer job
prnJob = PrinterJob.getPrinterJob();
if(format == null)
{
format = prnJob.defaultPage();
}
//The below command line sets the printable interface and the
//format for the page to be printed
prnJob.setPrintable(StyledTextTableRenderer1, format);
//The below command line calls the native print dialog
if(prnJob.printDialog() == false)
{
return;
}
//The below command line prints out the document if the user clicked Ok
prnJob.print();
}
catch (PrinterException e)
{
}
}
public void actionPerformed(ActionEvent event)
{
JComponent b = (JComponent)event.getSource();
if(b == Button12)
{
printData();
fr.repaint();
}
}
public static void main(String args[])
{
JTables2 a = new JTables2();
a.initialize();
}
}
class StyledTextTableRenderer2 implements Printable
{
JTable Table1 = new 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();
//leave room for page number
double pageHeight = pageFormat.getImageableHeight() - fontHeight;
double pageWidth = pageFormat.getImageableWidth();
double tableWidth = (double)Table1.getColumnModel().getTotalColumnWidth();
double headerHeightOnPage = Table1.getTableHeader().getHeight();
double tableWidthOnPage = tableWidth;
double oneRowHeight = (Table1.getRowHeight()+ Table1.getRowMargin());
int numRowsOnAPage = (int)((pageHeight-headerHeightOnPage)/ oneRowHeight);
double pageHeightForTable = oneRowHeight * numRowsOnAPage;
int totalNumPages= (int)Math.ceil(((double)Table1.getRowCount())/numRowsOnAPage);
if(pageIndex>=totalNumPages)
{
Table1.setShowGrid(true);
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 = Table1.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));
}
//This is where i try to draw the rectangle around
//the JTable
g2.drawRect(0,(int)headerHeightOnPage,(int)tableWidthOnPage, (int)((pageHeightForTable)* Table1.getRowCount()));
Table1.paint(g2);
g2.translate(0f, pageIndex * pageHeightForTable);
g2.translate(0f, -headerHeightOnPage);
g2.setClip(0, 0, (int)Math.ceil(tableWidthOnPage),(int)Math.ceil(headerHeightOnPage));
Table1.getTableHeader().paint(g2);
//paint header at top
/*
g2.translate(0f, pageIndex * pageHeightForTable);
g2.setColor(Color.gray);
g2.drawRect(0,0,(int)tableWidthOnPage, (int)((pageHeightForTable)* Table1.getRowCount()));
*/
System.out.println("" + pageHeightForTable);
return Printable.PAGE_EXISTS;
}
public void settable(JTable table)
{
//This function gets the JTable and its table model
Table1 = table;
Table1.setShowGrid(false);
}
}