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畫出來的我可以直接調用寫入之前數據庫的數組模型。
其實主要的還是畫出來的感覺要自由好多,想怎么畫就怎么畫。
