我抄了一个可以预览的打印稍微改了一下!这个程序是打印table的数据的!不知道合适你不!有四个类分别是MakeJbook ,Mainstart,PrintPreviewCanvas,PrintPreviewDialog。
public class PrintPreviewDialog extends JDialog {
class Scale extends Object {
private double value;
public Scale(double value)
{
this.value = value;
}
public final String toString()
{
return (int) (value * 100) + "%";
}
public final double getValue()
{
return value;
}
}
public PrintPreviewDialog(JDialog jd,String title,boolean mt,Book b)
{
super(jd,title,mt);
layoutUI(b);
}
public void layoutUI(Book book)
{
setSize(WIDTH, HEIGHT);
Container contentPane = getContentPane();
canvas = new PrintPreviewCanvas(book);
contentPane.add(new JScrollPane(canvas), BorderLayout.CENTER);
JPanel buttonPanel = new JPanel();
JButton nextButton = new JButton("下一页");
buttonPanel.add(nextButton);
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event)
{
canvas.flipPage(1);
}
});
JButton previousButton = new JButton("上一页");
buttonPanel.add(previousButton);
previousButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event)
{
canvas.flipPage(-1);
}
});
JButton closeButton = new JButton("Close");
buttonPanel.add(closeButton);
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event)
{
dispose();
}
});
final JComboBox scaleChoice = new JComboBox();
scaleChoice.setEditable(false);
scaleChoice.addItem(new Scale(2));
scaleChoice.addItem(new Scale(1.5));
scaleChoice.addItem(new Scale(1.0));
scaleChoice.addItem(new Scale(0.75));
scaleChoice.addItem(new Scale(0.5));
scaleChoice.addItem(new Scale(0.25));
scaleChoice.setSelectedIndex(2) ;
scaleChoice.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e)
{
if (e.getStateChange() == ItemEvent.SELECTED) {
final Scale scale = (Scale) e.getItem();
canvas.scale(scale.getValue());
}
}
});
buttonPanel.add(new JLabel("Zoom:"));
buttonPanel.add(scaleChoice);
contentPane.add(buttonPanel, BorderLayout.NORTH);
JPanel buttonPane2 = new JPanel();
contentPane.add(buttonPane2, BorderLayout.SOUTH );
}
private PrintPreviewCanvas canvas;
private static final int WIDTH = 650;
private static final int HEIGHT = 800;
}
public class PrintPreviewCanvas extends JPanel {
public PrintPreviewCanvas(Book b) {
book = b;
currentPage = 0;
final PageFormat page = book.getPageFormat(0);
setPreferredSize(new Dimension((int) (page.getWidth() * ratio),
(int) (page.getHeight() * ratio)));
}
// 填充Panel
public void paintComponent(Graphics g) {
super.paintComponent(g);
/*
* 此 Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。
* 它是用于在Java(tm) 平台上呈现二维形状、文本和图像的基础类。
*/
Graphics2D g2 = (Graphics2D) g;
final Dimension prefSize = getPreferredSize();
final int viewWidth = getWidth();
final int viewHeight = getHeight();
final int pageWidth = prefSize.width;
final int pageHeight = prefSize.height;
Rectangle2D page = new Rectangle2D.Double((viewWidth - pageWidth) / 2,
(viewHeight - pageHeight) / 2, pageWidth, pageHeight);
g2.setPaint(Color.white);
g2.fill(page);
g2.setPaint(Color.black);
g2.draw(page);
final Printable printable = book.getPrintable(currentPage);
final PageFormat pageFormat = book.getPageFormat(currentPage);
try {
Graphics2D dc = (Graphics2D) g2.create((int) page.getX(),
(int) page.getY(), (int) page.getWidth(), (int) page
.getHeight());
dc.scale(ratio, ratio);
printable.print(dc, pageFormat, currentPage);
dc.dispose();
} catch (PrinterException exception) {
g2.draw(new Line2D.Double(page.getMinX(), page.getMinY(), page
.getMaxX(), page.getMaxY()));
g2.draw(new Line2D.Double(page.getMaxX(), page.getMinY(), page
.getMinX(), page.getMaxY()));
}
}
public void flipPage(int by) {
int newPage = currentPage + by;
if (0 <= newPage && newPage < book.getNumberOfPages()) {
currentPage = newPage;
repaint();
}
}
public void scale(double ratio) {
this.ratio = Math.max(0.1, ratio);
final PageFormat page = book.getPageFormat(0);
setPreferredSize(new Dimension((int) (page.getWidth() * this.ratio),
(int) (page.getHeight() * this.ratio)));
revalidate();
repaint();
}
private Book book;
private int currentPage;
private double ratio = 1.0;
}
public class Mainstart {
public static PrinterJob getPrinterJ() {
return java.awt.print.PrinterJob.getPrinterJob();
}
/**
* @param args
*/
public static void main(String[] args) {
JFrame frame = new JFrame("JTable的排序测试");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 表格中显示的数据
Object rows[][] = { { "王明", "中国", "44" }, { "姚明", "中国", "25" },
{ "赵子龙", "西蜀", "1234" }, { "曹操", "北魏", "2112" },
{ "Bill Gates", "美国", "45" }, { "Mike", "英国", "33" } };
String columns[] = { "姓名", "国籍", "年龄" };
TableModel model = new DefaultTableModel(rows, columns);
JTable table = new JTable(model);
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
JScrollPane pane = new JScrollPane(table);
frame.add(pane, BorderLayout.CENTER);
frame.setSize(300, 150);
frame.setVisible(true);
JDialog dialog = new JDialog();
Vector vCol = new Vector();
Vector vSite = new Vector();
for (int i = 0; i < 3; i++) {
for (int j = 0; i < 4; i++) {
vCol.add(j);
vSite.add(j);
}
}
for (int j = 0; j < 3; j++) {
// g.drawString((String) jtable.getValueAt(row,
// ((Integer) vCol.get(j)).intValue()),
// ((Integer) vSite.get(j)).intValue(), drawli);
for (int i = 0; i < 5; i++)
// g.drawString((String) table.getValueAt(row,
// (Integer) j),
// / ((Integer) vSite.get(j)).intValue(), drawli);
System.out.println((String) table.getValueAt(i, ((Integer) j)
.intValue()));
}
Mainstart a = new Mainstart();
MakeJbook mjbook = new MakeJbook("操作情况查询结果", table, columns, vCol,
vSite);
Book book;
book = mjbook.makebook();
PrintPreviewDialog ppd = new PrintPreviewDialog(dialog, "打印预览", true,
book);
ppd.setVisible(true);
PrinterJob job = Mainstart.getPrinterJ();
job.setPageable(book);
if (job.printDialog()) {
try {
job.print();
} catch (PrinterException pe) {
System.err.println("打印失败...");
}
}
}
}
public class MakeJbook {
JTable jtable;
Vector vCol;
Vector vSite;
String title;
String[] tablehead;// 列名
Font head = new Font("宋体", Font.PLAIN, 14);
Font text = new Font("宋体", Font.PLAIN, 12);
private final int hjg = 15;// 行间隔
int hs = 0;// 每页可打印的行数
int pagecount = 0;
public MakeJbook(String title, JTable jtable, String[] tablehead,
Vector vCol, Vector vSite) {
this.jtable = jtable;
this.tablehead = tablehead;
this.vCol = vCol;
this.vSite = vSite;
this.title = title;
}
public Book makebook() {
int temp = 0;
Book book = new Book();
//PageFormat pf=Mainstart.getPaperF();
PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
if (pf.getImageableWidth() == 702 && pf.getOrientation() == 0) {
hs = 34;
} else if (pf.getImageableWidth() == 594 && pf.getOrientation() == 1) {
hs = 42;
} else if (pf.getImageableWidth() == 752 && pf.getOrientation() == 0) {
hs = 28;
} else if (pf.getImageableWidth() == 505 && pf.getOrientation() == 1) {
hs = 45;
} else {
// 如果 page format 不符合以上幾種呢?每頁該印幾行?
hs = 30;
}
pagecount = jtable.getRowCount() / hs;
temp = jtable.getRowCount() % hs;
if (temp != 0) {
pagecount = pagecount + 1;
}
for (int i = 0; i < pagecount; i++) {
book.append(new PaintCover(hs * i), pf);
}
return book;
}
class PaintCover implements Printable {
private final int startRow;
public PaintCover(int startRow) {
this.startRow = startRow;
}
public int print(Graphics g, PageFormat pf, int pageIndex)
throws PrinterException {
g.translate((int) pf.getImageableX(), (int) pf.getImageableY());
g.setColor(Color.black);
g.setFont(head);
g.drawString(title, ((int) pf.getImageableWidth() - title
.length() * 9) / 2, 15);
g.setFont(text);
g.drawString("第" + String.valueOf(pageIndex + 1) + "頁", 10, 10);
g.drawLine(80, 18, (int) pf.getImageableWidth() - 80, 18);
g.drawLine(80, 20, (int) pf.getImageableWidth() - 80, 20);
g.drawLine(0, 50, (int) pf.getImageableWidth(), 50);
g.drawLine(0, 70, (int) pf.getImageableWidth(),70);
g.drawLine(0, 70, (int) pf.getImageableWidth(),70);
for (int i = 0; i < 3; i++) {
//g.drawString(tablehead[((Integer) vCol.elementAt(i)).intValue()],
// ((Integer) vSite.get(i)).intValue(), 45); vCol.size();
g.drawString(tablehead[i],
i*200, 45);
//System.out.println(tablehead[((Integer)
//vCol.get(i)).intValue()]);
//System.out.println(vCol.elementAt(i));
}
int drawli = 50 + hjg;
int row = startRow;
for (int i = 0; i < jtable.getColumnCount(); i++) {
//row++;
for (int j = 0; j < jtable.getRowCount(); j++) {
//g.drawString((String) jtable.getValueAt(row,
// ((Integer) vCol.get(j)).intValue()),
// ((Integer) vSite.get(j)).intValue(), drawli);
g.drawString((String) jtable.getValueAt(j,
(Integer) i),
((Integer) i).intValue()*200,drawli+j*20);
g.drawLine(0, 70+j*20, (int) pf.getImageableWidth(),70+j*20);
//System.out.println((String) jtable.getValueAt(j,
// ((Integer) i).intValue()));
}
// drawli = drawli + hjg;
++row;
if (row >= jtable.getRowCount()) {
break;
}
}
return Printable.PAGE_EXISTS;
}
}
}