各位csdn友,大家好..
软件开发背景:
我现在做一个进销存软件,需要提供打印功能,请大家帮忙.
打印功能的具体要求:
打印
table的内容,table的标题,页眉(医疗品种类,医疗品检索)页脚(验收结论,入库时间,结算方式,经手人)
并且支持分页打印
最好还有分页打印!
打印哪些列不需要考虑
完整代码
:
软件开发背景:
我现在做一个进销存软件,需要提供打印功能,请大家帮忙.
打印功能的具体要求:
打印
table的内容,table的标题,页眉(医疗品种类,医疗品检索)页脚(验收结论,入库时间,结算方式,经手人)
并且支持分页打印
最好还有分页打印!
打印哪些列不需要考虑
完整代码
:
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.util.List;
import java.awt.GridBagLayout;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;import java.awt.event.ActionEvent;import java.util.Date;
import java.awt.Insets;import java.awt.event.ActionListener;
import java.awt.Dimension;
import java.util.Locale;
import java.util.ArrayList;
import java.util.Iterator;
import java.awt.Toolkit;
import java.util.Properties;
import java.awt.*;
import java.awt.print.PageFormat;
import java.awt.print.*;
import java.awt.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.swing.*;
import javax.swing.table.*;public class JHDDemo extends JFrame {
private JTable table;
private JComboBox conditionContent;
private JTextField goodsname;
private JComboBox conditionName; //物品五大类
//时间控件,取消
// private DatePicker datepickStat;
private static final String DefaultFormat = "yyyy-MM-dd";
private Date date = new Date();
private Font font = new Font("Times New Roman", Font.BOLD, 14);
private Dimension dimension = new Dimension(177, 24);
private int[] hilightDays = {1, 3, 5, 7};
// private String username = Login.loginName; // 登录用户信息
private final JComboBox ysjl = new JComboBox(); // 验收结论
private final JComboBox jsr = new JComboBox(); // 操作员
private final JComboBox jsfs = new JComboBox(); // 计算方式
public double rkdj = 0.00;
private DefaultTableModel dftm;
//private FJReport print;
private JScrollPane scrollPane; private String title;
public JHDDemo() {
super();
// setClosable(true); //frame init
setTitle("医疗用品入库");
getContentPane().setLayout(new GridBagLayout());
setBounds(100, 100, 609, 375); //table init
table = new JTable();
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
init(); //scrollPane init & set layout
scrollPane = new JScrollPane(table);
scrollPane.setPreferredSize(new Dimension(800, 800));
final GridBagConstraints gridBagConstraints_6 = new GridBagConstraints();
gridBagConstraints_6.weighty = 1.0;
gridBagConstraints_6.anchor = GridBagConstraints.NORTH;
//gridBagConstraints_6.anchor = GridBagConstraints.NORTH;//当组件小于其显示区域时使用此字段。它可以确定在显示区域中放置组件的位置
gridBagConstraints_6.insets = new Insets(0, 10, 0, 10);
//此字段指定组件的外部填充,即组件与其显示区域边缘之间间距的最小量。 默认值为 new Insets(0, 0, 0, 0)。
gridBagConstraints_6.fill = GridBagConstraints.BOTH;
//当组件的显示区域大于它所请求的显示区域的大小时使用此字段。它可以确定是否调整组件大小,以及如果需要,如何调整。
gridBagConstraints_6.gridwidth = 5;
//指定在组件显示区域的一行中的单元格数。
gridBagConstraints_6.gridy = 1;
// 指定位于组件显示区域的顶部的单元格,其中最上边的单元格为 gridy=0。
gridBagConstraints_6.gridx = 0;
// 指定包含组件的显示区域开始边的单元格,其中行的第一个单元格为 gridx=0。
getContentPane().add(scrollPane, gridBagConstraints_6); // set other comoponte layout
setupComponet(new JLabel(" 医疗用品种类:"), 1, 0, 1, 50, true);
conditionName = new JComboBox();
conditionName.setModel(new DefaultComboBoxModel(new String[] {"---选择--",
"卫生材料",
"低值易耗品", "印刷品", "试剂", "其它材料"}));
setupComponet(conditionName, 2, 0, 1, 50, true);
setupComponet(new JLabel("医疗品检索:"), 3, 0, 1, 50, false);
conditionContent = new JComboBox();
conditionContent.setEditable(true);
conditionContent.setMaximumRowCount(5);
setupComponet(conditionContent, 4, 0, 1, 50, true);
setupComponet(new JLabel("验收结论:"), 1, 2, 1, 50, true);
ysjl.addItem("合格");
ysjl.addItem("不合格");
ysjl.setEditable(true);
setupComponet(ysjl, 2, 2, 1, 50, true);
setupComponet(new JLabel("结算方式:"), 3, 2, 1, 50, true);
jsfs.addItem("现金");
jsfs.addItem("转账");
jsfs.setEditable(true);
setupComponet(jsfs, 4, 2, 1, 50, true);
//datepick contorll init & set layout
setupComponet(new JLabel(" 入库时间:"), 1, 3, 1, 50, true);
/* datepickStat = new DatePicker(date, DefaultFormat, font, dimension);
datepickStat.setBounds(137, 83, 177, 24);
datepickStat.setHightlightdays(hilightDays, Color.red);
datepickStat.setLocale(Locale.CHINA);
datepickStat.setTimePanleVisible(false);
datepickStat.setPreferredSize(new Dimension(100, 21));
setupComponet(datepickStat, 2, 3, 1, 50, true);*/
setupComponet(new JLabel("经手人:"), 3, 3, 1, 50, false);
jsr.setEditable(true);
jsr.addItem("李波");
jsr.addItem("林顺珍");
setupComponet(jsr, 4, 3, 1, 50, true); //set some button layout
// 单击添加按钮在表格中添加新的一行
final JButton tjButton = new JButton("添加");
tjButton.addActionListener(new TjActionListener());
setupComponet(tjButton, 1, 4, 1, 1, false); JButton dyButton = new JButton("打印");
dyButton.addActionListener(new DyActionListener());
setupComponet(dyButton, 4, 4, 1, 1, false); }
// 设置组件位置并添加到容器中
private void setupComponet(JComponent component, int gridx, int gridy,
int gridwidth, int ipadx, boolean fill) {
final GridBagConstraints gridBagConstrains = new GridBagConstraints();
gridBagConstrains.gridx = gridx;
gridBagConstrains.gridy = gridy;
if (gridwidth > 1) {
gridBagConstrains.gridwidth = gridwidth;
}
if (ipadx > 0) {
gridBagConstrains.ipadx = ipadx;
}
gridBagConstrains.insets = new Insets(5, 1, 3, 1);
if (fill) {
gridBagConstrains.fill = GridBagConstraints.HORIZONTAL;
}
getContentPane().add(component, gridBagConstrains);
} /**
*
* <p>Title:添加按钮的事件监听器 </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2009</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
class TjActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) { // 结束表格中没有编写的单元
// stopTableCellEditing();
// 如果表格中还包含空行,就再添加新行
for (int i = 0; i < table.getRowCount(); i++) {
String info = (String) table.getValueAt(i, 0);
if (table.getValueAt(i, 0) == null) {
return;
}
}
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.addRow(new Vector()); }
} /**
*
* <p>Title: 内部类,监听打印</p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2009</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
private final class DyActionListener implements ActionListener {
public void actionPerformed(final ActionEvent e) {
// printTable();
PrintReport(table, "abc");
} }
/**
* 打印
*/
private void printTable() {
Toolkit kit = Toolkit.getDefaultToolkit(); //获取工具箱
Properties props = new Properties();
props.put("awt.print.printer", "durango"); //设置打印属性
props.put("awt.print.numCopies", "2"); if (kit != null) {
//获取工具箱自带的打印对象
PrintJob printJob = kit.getPrintJob(JHDDemo.this, "打印 页面", props); if (printJob != null) {
Graphics pg = printJob.getGraphics(); //获取打印对象的图形环境
//Graphics2D g2 = (Graphics2D) pg; ///
PageFormat pf = new PageFormat(); ///
// g2.translate(pf.getImageableX(), pf.getImageableY()); ///转换坐标,确定打印边界
if (pg != null) {
try {
pg.dispose(); // Shoot the page to printer
this.scrollPane.printAll(pg); //打印该窗体的组件
// this.table.printAll(pg);
} finally {
pg.dispose(); //注销图形环境pageIndex
}
}
printJob.end(); //结束打印作业
}
}
}
/***
* 打印2
*/ public void PrintReport(JTable table, String title) { this.title = title;
PrintService[] services = PrintServiceLookup.lookupPrintServices(
DocFlavor.SERVICE_FORMATTED.PRINTABLE, null
);
if (services.length > 1) { PrintRequestAttributeSet attributes = new
HashPrintRequestAttributeSet();
PrintService service = ServiceUI.printDialog(null, 50, 50, services,
services[0], null, attributes);
if (service != null) {
DocPrintJob job = service.createPrintJob();
try {
Doc doc = new SimpleDoc(this,
DocFlavor.SERVICE_FORMATTED.
PRINTABLE, null);
job.print(doc, attributes);
} catch (PrintException pe) {
pe.printStackTrace();
}
}
}
} /**
* print 3---not value
* @param g Graphics
* @param pf PageFormat
* @param pageIndex int
* @return int
*/
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (pageIndex == 0) {
Graphics2D g2d = (Graphics2D) g;
g2d.translate(pf.getImageableX(), pf.getImageableY());
g2d.setColor(Color.black);
g2d.drawString(title, 0, 20);
for (int i = 0; i < table.getColumnCount(); i++) {
g2d.drawString(table.getColumnName(i), i * 100, 40);
}
for (int i = 0; i < table.getRowCount(); i++) {
for (int ii = 0; ii < table.getColumnCount(); ii++) {
String cell;
Object original = table.getValueAt(i, ii);
if (original == null) {
cell = "";
} else {
cell = original.toString();
}
g2d.drawString(cell, ii * 100, 60 + i * 20);
}
}
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
} /**
* table 初始化
*/
public void init() {
table.getTableHeader().setReorderingAllowed(false);
table.setEnabled(true);
dftm = (DefaultTableModel) table.getModel(); String[] tableHeads = {"医疗品名称", "医疗品税票", "单价",
"数量", "商品编号", "生产企业", "单位", "规格",
"包装", "生产日期", "有效期", "批号", "批准文号"}; dftm.setColumnIdentifiers(tableHeads); } public static void main(String[] args) {
JHDDemo jhddemo = new JHDDemo();
jhddemo.pack();
jhddemo.setVisible(true);
}
}
现在是可以打印啦,可是,如何分页打印呢?
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.text.MessageFormat;import cn.xy.table.GroupHeader;
import cn.xy.table.GroupHeaderUi;
import cn.xy.table.Rtable;public class RPrinter implements Printable {
private Rtable rt;
private GroupHeader gh;
private double twidth;
private double rheight;
private double headerheight;
private Font font_1;
private Font font_2;
private MessageFormat footerformat;
double printheaderheight;
double printrowheight;
int printpagerow;
private double scale = 1.0;
private int pagecount = -1;
private int curpage = 1 ;
public RPrinter(Rtable rt, MessageFormat footerformat) {
this.rt = rt;
this.gh = (GroupHeader) rt.getTableHeader();
this.twidth = gh.getColumnModel().getTotalColumnWidth();
this.rheight = rt.getRowHeight() + rt.getRowMargin();
headerheight = gh.getHeight();
font_1 = rt.getFont().deriveFont(0, 12f);
font_2 = rt.getFont().deriveFont(1, 18f);
this.footerformat = footerformat;
} public int print(Graphics g, PageFormat pf, int page)
throws PrinterException {
double i_1 = pf.getImageableWidth();
double i_2 = pf.getImageableHeight();
if (i_1 <= 0) {
throw new PrinterException("print area is too small");
}
if(pagecount == -1){
pagecount = this.getPagecount(pf, g);
}
if (page >= pagecount) {
return NO_SUCH_PAGE;
} Object[] obj = { new Integer(page+1) };
String footer = footerformat.format((Object) obj);
Rectangle2D r2d = g.getFontMetrics().getStringBounds(footer, g);
int footerheight = (int) Math.ceil(r2d.getHeight()) + 8;
i_2 -= footerheight;
if (i_2 <= 0) {
throw new PrinterException("print area is too small");
}
rt.setPagesize(this.printpagerow);
rt.renderCurpageData(page+1);
Graphics2D g2d = (Graphics2D) g;
double printtablewidth = this.twidth * scale;
double tran_y = pf.getImageableY();
double tran_x = pf.getImageableX();
if (scale == 1.0) {
double emp = (i_1 - this.twidth) / 2 ;
tran_x += emp;
}
g2d.translate(tran_x, tran_y);
g2d.setClip(0, 0, (int) Math.ceil(printtablewidth), (int) Math
.ceil(this.printheaderheight));
g2d.scale(scale, scale);
this.gh.print(g2d);
g2d.scale(1 / scale, 1 / scale);
g2d.translate(0, this.printheaderheight);
g2d.setClip(0, 0, (int) Math.ceil(printtablewidth), (int) Math
.ceil(this.printpagerow * this.printrowheight));
g2d.scale(scale, scale);
this.rt.print(g2d);
g2d.scale(1 / scale, 1 / scale);
tran_x = (i_1 - r2d.getWidth())/2;
g2d.translate(tran_x, i_2+8);
g2d.setClip(r2d);
g2d.drawString(footer, 0, 0);
return PAGE_EXISTS;
} public double getHeaderHeight(double scale) {
return this.headerheight * scale;
} public double getRowheight(double scale) {
return this.rheight * scale;
} public int getPageRowcount(double pageheight, double rowheight,
double headerheight) { return (int) ((pageheight - headerheight) / rowheight);
} public int getPagecount(PageFormat pf, Graphics g) {
double i_1 = pf.getImageableWidth();
double i_2 = pf.getImageableHeight(); g.setFont(font_1);
Object[] obj = { new Integer(1) };
String footer = footerformat.format((Object) obj);
int footerheight = (int) Math.ceil(g.getFontMetrics().getStringBounds(
footer, g).getHeight()) + 8; i_2 -= footerheight;
if (i_1 < this.twidth) {
this.scale = i_1 / this.twidth;
}
printheaderheight = this.getHeaderHeight(scale);
printrowheight = this.getRowheight(scale);
printpagerow = this.getPageRowcount(i_2, printrowheight,
printheaderheight);
pagecount = (int) Math.ceil((double) rt.getResulttable()
.getRowcount()
/ printpagerow);
return pagecount;
} public int getPagecount() {
return pagecount;
} public void setPagecount(int pagecount) {
this.pagecount = pagecount;
} public int getCurpage() {
return curpage;
} public void setCurpage(int curpage) {
this.curpage = curpage;
}}