Re: Printing slow as an Applet
- From: jianghong2010@xxxxxxxxx
- Date: 30 Jun 2005 07:43:54 -0700
The following is my code. It's a JTable with a print function. When I
run it as a standalone program use main, it prints OK. But the applet
prints extremely slow.
Does anyone know what the possibilities are?
Thanks.
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;
import java.applet.Applet;
public class Report extends Applet implements Printable {
JFrame frame;
JTable tableView;
public Report() {
frame = new JFrame("Sales Report");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
final String[] headers = {"Description", "open price",
"latest price", "End Date",
"Quantity",
"Description", "open price",
"latest price", "End Date",
"Quantity"};
final Object[][] data = new Object[300][10];
for (int i = 0; i < 300; i++) {
String filename = "sent.gif";
data[i][0] = new ImageIcon(getClass().
getResource(filename));
data[i][1] = new Integer(i).toString();
data[i][2] = "6.99ABCDEFGASDGKJSDGKJSDLGKHJDFBINP_WEOTJU";
data[i][3] = new Date().toString();
data[i][4] = "asl;dkghs;odfgjhs[qwe
r[pwusdhljkfnhg;osdfghw[ioere";
data[i][9] = new ImageIcon(getClass().
getResource(filename));
data[i][8] = new Integer(i).toString();
data[i][7] = "6.99ABCDEFGASDGKJSDGKJSDLGKHJDFBINP_WEOTJU";
data[i][6] = new Date().toString();
data[i][5] = "asl;dkghs;odfgjhs[qwe
r[pwusdhljkfnhg;osdfghw[ioere";
}
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;
}
};
tableView = new JTable(dataModel);
JScrollPane scrollpane = new JScrollPane(tableView);
scrollpane.setPreferredSize(new Dimension(500, 80));
frame.getContentPane().setLayout(
new BorderLayout());
frame.getContentPane().add(
BorderLayout.CENTER, scrollpane);
frame.pack();
JButton printButton = new JButton();
printButton.setText("print me!");
frame.getContentPane().add(
BorderLayout.SOUTH, printButton);
// for faster printing turn double buffering off
RepaintManager.currentManager(
frame).setDoubleBufferingEnabled(false);
printButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPrintable(Report.this);
pj.printDialog();
try {
pj.print();
} catch (Exception PrintException) {}
}
});
frame.setVisible(true);
}
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(
).getTotalColumnWidth();
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());
//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 =
tableView.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);
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;
}
public static void main(String[] args) {
new Report();
}
public void init() {
try {
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
new Report();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
.
- References:
- Printing slow as an Applet
- From: jianghong2010
- Printing slow as an Applet
- Prev by Date: Printing slow as an Applet
- Next by Date: Re: Printing slow as an Applet
- Previous by thread: Printing slow as an Applet
- Next by thread: Re: Printing slow as an Applet
- Index(es):