JAVA打印類(帶預覽)


package tool;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.print.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Printclass {
    //595×842
    static String dh;                     //單號
    static String lxr;                   //聯系人
    static String tel;
    static String date;
    static String khm;                 //客戶名
    static String add;                   //地址
    static String js="現金";                     //結算方式
    static List<Object> kh=new ArrayList<Object>();        //客戶信息list
    static List<Object> sp=new ArrayList<Object>();           //主體list
    static List<Object> hj=new ArrayList<Object>();             //尾部List
    public static void setkhls(List<Object> kh){
        Printclass.kh=kh;
        dh=kh.get(0).toString().trim();
        khm=kh.get(1).toString().trim();
        lxr=kh.get(2).toString().trim();
        tel=kh.get(3).toString().trim();
        add=kh.get(4).toString().trim();
        Date d=new Date();
        date=String.format("%tF",d);
    }
    public static void setsp(List<Object> sp){
        Printclass.sp=sp;
    }
    public static void sethj(List<Object> hj){
        Printclass.hj=hj;
    }
    public  Printclass(){
        JFrame jf=new JFrame();
        jf.setSize(595,842);
        Container c=jf.getContentPane();
        c.add(new Draw());
        jf.addKeyListener(new KeyListener(){
            @Override
            public void keyPressed(KeyEvent e) {
                // TODO Auto-generated method stub
                if(e.getKeyCode()==KeyEvent.VK_P){
                    try {
                        PrinterJob job = PrinterJob.getPrinterJob();
                        if (!job.printDialog()){
                            return;
                        }else{
                            job.setPrintable(new Printable() {
                                public int print(Graphics graphics, PageFormat pageFormat,
                                        int pageIndex) throws PrinterException {
                                    if (pageIndex > 0){
                                        return Printable.NO_SUCH_PAGE;
                                    }else{
                                        Graphics2D g2 = (Graphics2D) graphics;
                                        Font font,font2,font3;
                                        font=new Font("黑體",Font.PLAIN,20);
                                        g2.setFont(font);
                                        g2.setFont(font);
                                        g2.drawString("*",190,35);//title
                                        font2=new Font("宋體",Font.PLAIN,10);
                                        g2.setFont(font2);
                                        g2.drawString("地址:  電話:  Fax:  ",100,50);  
                                        font3=new Font("宋體",Font.PLAIN,10);
                                        g2.setFont(font3);
                                        g2.drawString("單號:",20,65);g2.drawString("日期:",240,65);g2.drawString("結算:",420,65);
                                        g2.drawString("客戶:",20,85);g2.drawString("聯系人:",240,85);g2.drawString("聯系電話:",420,85);
                                        g2.drawString("地址:",20,105);
                                        g2.drawString(dh,50,65);g2.drawString(date,270,65);g2.drawString(js,445,65);
                                        g2.drawString(khm,50,85);g2.drawString(lxr,280,85);g2.drawString(tel,470,85);
                                        g2.drawString(add,50,105);
                                        List<String> ls=new ArrayList<String>();
                                        ls.add("序號");ls.add("商品種類");ls.add("商品名稱");ls.add("單位");ls.add("折扣");ls.add("單價");ls.add("數量");ls.add("金額");ls.add("備注");
                                        int n[]=new int[]{0,2,4,10,3,3,4,3,4,4};
                                        int s=0;
                                        int x=20;
                                        int y=115;
                                        int row=0;
                                        int count=0;
                                        List<Object> lsx=new ArrayList<Object>();
                                        lsx=sp;
                                        System.out.println(lsx.size());
                                        for(int i=0;i<lsx.size()/9+3;i++){    //畫橫線
                                            y=115+row*18;
                                            if(i==1){
                                                for(int j=0;j<ls.size();j++){
                                                    s=n[j]*14;
                                                    x=x+s;
                                                    g2.drawString(ls.get(j),x+3,y-4); //寫入表頭數據
                                                }
                                            }
                                            s=0;
                                            x=20;
                                            if(i>1&&i<lsx.size()/9+2){
                                                for(int j=0;j<9;j++){
                                                    s=n[j]*14;
                                                    x=x+s;
                                                    System.out.println(j+"    "+x);
                                                    g2.drawString(lsx.get(j+count*9).toString().trim(),x+3,y-4);    // 寫入當行數據
                                                }
                                                count++;
                                            }
                                            if(i==lsx.size()/9+2){
                                                g2.drawString(hj.get(0).toString().trim(),51,y-4);
                                                g2.drawString(hj.get(1).toString().trim(),387,y-4);
                                                g2.drawString(hj.get(2).toString().trim(),429,y-4);
                                            }
                                            g2.drawLine(20,y,538,y);//橫線
                                            row++;
                                        }
                                        count=0;
                                        row=0;
                                        s=0;
                                        x=20;
                                        for(int i=0;i<ls.size()+1;i++){  //畫豎線
                                            s=n[i]*14;
                                            x=x+s;
                                            if(i<2||i>5){
                                                g2.drawLine(x,115,x,y);//豎線
                                            }else{
                                                g2.drawLine(x,115,x,y-18);//豎線
                                            }
                                            if(i==0){
                                                g2.drawString("合計",x+3,y-4);
                                            }
                                        }
                                        System.out.println(y);
                                        g2.drawString("開單人:                                   經手人:                          收貨人:",20,y+20);
                                        g2.drawString("白色:存根聯         紅色:記賬聯      藍色:收款聯         黃色:收貨聯",20,y+40);
                                        return Printable.PAGE_EXISTS;
                                    }
                                }
                            });
                        }
                        job.setJobName("打印圖形");
                        job.print();
                    } catch (PrinterException e1) {
                        e1.printStackTrace();
                    }
                }
            }
            @Override
            public void keyReleased(KeyEvent e) {
                // TODO Auto-generated method stub
            }
            @Override
            public void keyTyped(KeyEvent e) {
                // TODO Auto-generated method stub
            }
        });
        jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }
    public static void main(String[] args) {
        new Printclass();
    }
    class Draw extends JPanel{
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        public void paint(Graphics g){
            super.paint(g);
            Font font,font2,font3;
            font=new Font("黑體",Font.PLAIN,20);
            Graphics2D g2=(Graphics2D) g;
            g2.setFont(font);
            g2.drawString("*",170,35);//標題
            font2=new Font("宋體",Font.PLAIN,10);
            g2.setFont(font2);
            g2.drawString("地址:   電話: Fax:",100,50);
            font3=new Font("宋體",Font.PLAIN,10);
            g2.setFont(font3);
            g2.drawString("單號:",20,65);g2.drawString("日期:",240,65);g2.drawString("結算:",420,65);
            g2.drawString("客戶:",20,85);g2.drawString("聯系人:",240,85);g2.drawString("聯系電話:",420,85);
            g2.drawString("地址:",20,105);
            g2.drawString(dh,50,65);g2.drawString(date,270,65);g2.drawString(js,445,65);
            g2.drawString(khm,50,85);g2.drawString(lxr,280,85);g2.drawString(tel,470,85);
            g2.drawString(add,50,105);
            List<String> ls=new ArrayList<String>();
            ls.add("序號");ls.add("商品種類");ls.add("商品名稱");ls.add("單位");ls.add("折扣");ls.add("單價");ls.add("數量");ls.add("金額");ls.add("備注");
            int n[]=new int[]{0,2,4,10,3,3,4,3,4,4};
            int s=0;
            int x=20;
            int y=115;
            int row=0;
            int count=0;
            List<Object> lsx=new ArrayList<Object>();
            lsx=sp;
            System.out.println(lsx.size());
            for(int i=0;i<lsx.size()/9+3;i++){    //畫橫線
                y=115+row*18;
                if(i==1){
                    for(int j=0;j<ls.size();j++){
                        s=n[j]*14;
                        x=x+s;
                        g2.drawString(ls.get(j),x+3,y-4); //寫入表頭數據
                    }
                }
                s=0;
                x=20;
                if(i>1&&i<lsx.size()/9+2){
                    for(int j=0;j<9;j++){
                        s=n[j]*14;
                        x=x+s;
                        System.out.println(j+"    "+x);
                        g2.drawString(lsx.get(j+count*9).toString().trim(),x+3,y-4);    // 寫入當行數據
                    }
                    count++;
                }
                if(i==lsx.size()/9+2){
                    g2.drawString(hj.get(0).toString().trim(),51,y-4);
                    g2.drawString(hj.get(1).toString().trim(),387,y-4);
                    g2.drawString(hj.get(2).toString().trim(),429,y-4);
                }
                g2.drawLine(20,y,538,y);//橫線
                row++;
            }
            count=0;
            row=0;
            s=0;
            x=20;
            for(int i=0;i<ls.size()+1;i++){  //畫豎線
                s=n[i]*14;
                x=x+s;
                if(i<2||i>5){
                    g2.drawLine(x,115,x,y);//豎線
                }else{
                    g2.drawLine(x,115,x,y-18);//豎線
                }
                if(i==0){
                    g2.drawString("合計",x+3,y-4);
                }
            }
            System.out.println(y);
            g2.drawString("開單人:                                   經手人:                          收貨人:",20,y+20);
            g2.drawString("白色:存根聯         紅色:記賬聯      藍色:收款聯         黃色:收貨聯",20,y+40);
        }
    }
}

之前一個項目的打印模塊,帶預覽。

預覽界面沒有設置打印按鈕,切換到英文輸入法按P鍵開始打印。

激光打印機打印清晰;針式打印機有輕微錯位,有漏色的現象,整體效果還是能看懂。(如果有朋友有解決辦法請私聊!!!!!)

整體構思:

  數據由主類生成,傳遞數組,判斷是否打印,清空主類數組。

為什么不用JTable打印:

  雖然JTable使用合並單元格也能做出來,而且更快速。(忘記是哪個版本了,JTable 可以直接調用print())

  但是JTable打印有邊框,而且邊框比較粗(有解決辦法請私聊!!!!!!)

  另外需要重新建數據模型,而用print畫出來的我可以直接調用寫入之前數據庫的數組模型。

  其實主要的還是畫出來的感覺要自由好多,想怎么畫就怎么畫。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM