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画出来的我可以直接调用写入之前数据库的数组模型。
其实主要的还是画出来的感觉要自由好多,想怎么画就怎么画。