您的位置:首页 > 编程语言 > Java开发

可以预览的打印的Java程序

2008-08-03 10:35 417 查看
我抄了一个可以预览的打印稍微改了一下!这个程序是打印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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐