Re: Printing slow as an Applet



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();
}
}

}

.


Quantcast