/*
* TableReportDemo.java
* This demo shows you how to customize the JTable print function.
* As an example, we print a report header with two rows and a border.
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import java.util.logging.*;
import javax.print.attribute.*;
import javax.swing.*;
import javax.swing.JTable.*;
import javax.swing.table.*;
public class TableReportDemo extends JFrame {
private JTable table;
private JButton btPrint;
private Action printAction = new AbstractAction("Print...") {
public void actionPerformed(final ActionEvent e) {
try {
printJTable();
} catch (PrinterException ex) {
Logger.getLogger(TableReportDemo.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
public TableReportDemo() {
super("TableReportDemo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btPrint = new JButton();
add(btPrint, BorderLayout.SOUTH);
btPrint.setAction(printAction);
add(new JScrollPane(createTable()), BorderLayout.CENTER);
pack();
}
public JTable createTable() {
String[] title = new String[]{"Title A", "Title B", "Title C", "Title D", "Title E"};
String[][] data = new String[][]{};
DefaultTableModel model = new DefaultTableModel(data, title);
table = new JTable(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for (int i = 0; i < 50; i++) {
model.addRow(new String[]{String.valueOf(i), "", "", ""});
}
return table;
}
private void printJTable() throws PrinterException {
// possibly prepare the table for printing here first
// wrap in a try/finally so table can be restored even if something fails
try {
// fetch the printable
Printable printable = new TableReport(table);
PrinterJob job = PrinterJob.getPrinterJob();// fetch a PrinterJob
job.setPrintable(printable);// set the Printable on the PrinterJob
// create an attribute set to store attributes from the print dialog
PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
// display a print dialog and record whether or not the user cancels it
boolean printAccepted = job.printDialog(attr);
if (printAccepted) {// if the user didn't cancel the dialog
job.print(attr);// do the printing
}
} finally {
// possibly restore the original table state here
}
}
public static void main(final String[] args) {
Runnable gui = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
ex.printStackTrace();
}
new TableReportDemo().setVisible(true);
}
};
//GUI must start on EventDispatchThread:
SwingUtilities.invokeLater(gui);
}
}
class TableReport implements Printable {
private Printable tablePrintable;
private PageFormat pageFormatJTable;
public TableReport(final JTable table) {
tablePrintable = table.getPrintable(JTable.PrintMode.FIT_WIDTH, null, null);
}
public int print(final Graphics graphics, final PageFormat pageFormat,
final int pageIndex) throws PrinterException {
Graphics2D g = (Graphics2D) graphics;
int x1 = (int) pageFormat.getImageableX();
int y1 = (int) pageFormat.getImageableY();
int w1 = (int) pageFormat.getImageableWidth();
int h1 = (int) pageFormat.getImageableHeight();
if (pageFormatJTable == null) {
pageFormatJTable = (PageFormat) pageFormat.clone();
Paper paperJTable = pageFormatJTable.getPaper();
if(pageFormatJTable.getOrientation() == PageFormat.PORTRAIT){
paperJTable.setImageableArea(x1, y1 + 60,//skip header area
w1, h1 - 90);//reserve space for header and footer
}else{
paperJTable.setImageableArea(y1 + 60, x1,//skip header area
h1 - 90, w1);//reserve space for header and footer
}
pageFormatJTable.setPaper(paperJTable);
}
String title = "Title";
String subtitle = "Subtitle";
Font f = g.getFont();
g.setFont(g.getFont().deriveFont(15f));
FontMetrics fm = g.getFontMetrics();
g.drawString(title, x1 + (w1-fm.stringWidth(title))/2, y1 + 15);
g.setFont(f);
fm = g.getFontMetrics();
g.drawString(subtitle, x1 + (w1-fm.stringWidth(subtitle))/2, y1 + 30);
g.drawRect(x1, y1, w1, 40);
String footer = "Page " + (pageIndex + 1);
g.drawString(footer, x1 + (w1-fm.stringWidth(footer))/2, y1 + h1 - 10);
//print the table:
Graphics gCopy = g.create();
int retVal = tablePrintable.print(gCopy, pageFormatJTable, pageIndex);
gCopy.dispose();
//
return retVal;
}
}