各位csdn友,大家好..
软件开发背景:
我现在做一个进销存软件,需要提供打印功能,请大家帮忙.
打印功能的具体要求:
打印
table的内容,table的标题,页眉(医疗品种类,医疗品检索)页脚(验收结论,入库时间,结算方式,经手人)
并且支持分页打印
最好还有分页打印!
打印哪些列不需要考虑
完整代码
:

解决方案 »

  1.   


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

  2.   


        // 设置组件位置并添加到容器中
        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);
        }
    }
      

  3.   

    呵呵,我现在调用java api table的打印print()...
    现在是可以打印啦,可是,如何分页打印呢?
      

  4.   

    打印的时候实现printable接口 进行分页 如果要进行换行等其他的操作 就要借助中间件生成 图像资源进行打印 package cn.xy.Report;import java.awt.Font;
    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;
    }}