目标任务: 用两台打印机分别实现打印不容的小票
1. 实体类:商品信息
/**
* 商品信息类
* @author admin
*
*/
public class Commodity {
// 商品名称
private String name;
// 商品单价
private String unit_price;
// 商品数量
private String num;
// 商品总价
private String sum;
public Commodity(String name, String unit_price, String num, String sum) {
super();
this.name = name;
this.unit_price = unit_price;
this.num = num;
this.sum = sum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUnit_price() {
return unit_price;
}
public void setUnit_price(String unit_price) {
this.unit_price = unit_price;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getSum() {
return sum;
}
public void setSum(String sum) {
this.sum = sum;
}
}
2.用于打印的内容: 结账单
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.util.ArrayList;
import java.util.Calendar;
/**
* 结账单
* 实现Printable接口 用于创建打印内容
* @author admin
*
*/
public class CheckOutTicket implements Printable {
private ArrayList<Commodity> list;
//订单编号
private String orders;
//商品总数
private String sale_num;
//总金额
private String sale_sum;
//支付金额
private String practical;
//支付方式
private String payMode;
//字体
private Font font;
// 构造函数
public CheckOutTicket(ArrayList<Commodity> list,String orders, String sale_num, String sale_sum,
String practical,String payMode) {
this.list = list;
this.orders = orders;
this.sale_num = sale_num;
this.sale_sum = sale_sum;
this.practical = practical;
this.payMode = payMode;
}
/**
* 打印方法
* graphics - 用来绘制页面的上下文,即打印的图形
* pageFormat - 将绘制页面的大小和方向,即设置打印格式,如页面大小一点为计量单位(以1/72 英寸为单位,1英寸为25.4毫米。A4纸大致为595 × 842点)
* 小票纸宽度一般为58mm,大概为165点
* pageIndex - 要绘制的页面从 0 开始的索引 ,即页号
**/
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
Component c = null;
//此 Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。
//它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。
//拿到画笔
Graphics2D g2 = (Graphics2D) graphics;
// 设置打印颜色为黑色
g2.setColor(Color.black);
// 打印起点坐标
double x = pageFormat.getImageableX(); //返回与此 PageFormat相关的 Paper对象的可成像区域左上方点的 x坐标。
double y = pageFormat.getImageableY(); //返回与此 PageFormat相关的 Paper对象的可成像区域左上方点的 y坐标。
// 虚线
float[] dash1 = { 4.0f };
// width - 此 BasicStroke 的宽度。此宽度必须大于或等于 0.0f。如果将宽度设置为
// 0.0f,则将笔划呈现为可用于目标设备和抗锯齿提示设置的最细线条。
// cap - BasicStroke 端点的装饰
// join - 应用在路径线段交汇处的装饰
// miterlimit - 斜接处的剪裁限制。miterlimit 必须大于或等于 1.0f。
// dash - 表示虚线模式的数组
// dash_phase - 开始虚线模式的偏移量
// 设置画虚线
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 4.0f, dash1, 0.0f));
// 设置打印字体(字体名称、样式和磅值大小)(字体名称可以是物理或者逻辑名称)
//Font.PLAIN:普通样式常量 Font.ITALIC:斜体样式常量 Font.BOLD:粗体样式常量。
font = new Font("宋体", Font.PLAIN, 16);
g2.setFont(font); //设置字体
float heigth = font.getSize2D();//字体高度
float line = heigth;//下一行开始打印的高度
//设置小票标题
g2.drawString("攸之源(横岗店)", (float)x+40, (float)y+line);
font = new Font("宋体",Font.BOLD,16);
g2.setFont(font);
heigth = font.getSize2D();//字体高度
line +=heigth;
//设置小票副标题
g2.drawString("结账单", (float)x+65, (float)y + line);
font = new Font("宋体",Font.PLAIN,16);
g2.setFont(font);
line =line+heigth*2;
//设置小票副标题
g2.drawString("桌号: 01号", (float)x, (float)y + line);
font = new Font("宋体", Font.PLAIN, 10);
g2.setFont(font); // 设置字体
heigth = font.getSize2D();// 字体高度
line +=heigth;
// 显示订单号
g2.drawString("订单编号:" + orders, (float) x , (float) y + line);
line+=heigth;
// 显示收银员
g2.drawString("下单时间:" + Calendar.getInstance().getTime().toLocaleString(), (float) x, (float) y + line);
line+=heigth;
g2.drawString("支付方式:" + payMode, (float) x , (float) y + line);
line+=heigth;
g2.drawString("支付金额:" + practical, (float) x , (float) y + line);
line += heigth;
//绘制虚线: (在此图形上下文的坐标系中使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。)
g2.drawLine((int) x, (int) (y + line), (int) x + 180, (int) (y + line));
line += heigth;
//显示标题
g2.drawString("品名", (float) x , (float) y + line+5);
g2.drawString("单价", (float) x + 60, (float) y + line+5);
g2.drawString("数量", (float) x + 100, (float) y + line+5);
g2.drawString("金额", (float) x + 150, (float) y + line+5);
line = line+heigth*2;
// 显示内容
for (int i = 0; i < list.size(); i++) {
Commodity commodity = list.get(i);
g2.drawString(commodity.getName(), (float) x, (float) y + line);
g2.drawString(commodity.getUnit_price(), (float) x + 60, (float) y + line);
g2.drawString(commodity.getNum(), (float) x + 100, (float) y + line);
g2.drawString(commodity.getSum(), (float) x + 150, (float) y + line);
line += heigth;
}
line += heigth;
//绘制虚线
g2.drawLine((int) x, (int) (y + line), (int) x + 180, (int) (y + line));
line = line+heigth*2;
g2.drawString("消费总金额:" + "¥" + sale_sum , (float) x+80, (float) y + line);
line = line+heigth*7;//空7行
g2.drawString("攸之源,健康美味之源!", (float) x + 40, (float) y + line);
line += heigth;
g2.drawString("横岗银信荣恒2楼", (float) x +50, (float) y + line);
line += heigth;
g2.drawString("0755-28912757", (float) x +50, (float) y +line);
switch (pageIndex) {
case 0:
return PAGE_EXISTS;//0
default:
return NO_SUCH_PAGE;//1
}
}
3. 用于打印的内容: 点餐单
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.util.ArrayList;
import java.util.Calendar;
/**
* 点餐单
* 实现Printable接口 用于创建打印内容
* @author admin
*
*/
public class OrderDishesTicket implements Printable{
private ArrayList<Commodity> list;
//订单编号
private String orders;
//总金额
private String sale_sum;
//支付金额
private String practical;
//支付方式
private String payMode;
// 构造函数
public OrderDishesTicket(ArrayList<Commodity> list,String orders,String sale_sum,
String practical,String payMode) {
this.list = list;
this.orders = orders;
this.sale_sum = sale_sum;
this.practical = practical;
this.payMode = payMode;
}
/**
* 打印方法
* graphics - 用来绘制页面的上下文,即打印的图形
* pageFormat - 将绘制页面的大小和方向,即设置打印格式,如页面大小一点为计量单位(以1/72 英寸为单位,1英寸为25.4毫米。A4纸大致为595 × 842点)
* 小票纸宽度一般为58mm,大概为165点
* pageIndex - 要绘制的页面从 0 开始的索引 ,即页号
**/
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
Component c = null;
//此 Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。
//它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。
//拿到画笔
Graphics2D g2 = (Graphics2D) graphics;
// 设置打印颜色为黑色
g2.setColor(Color.black);
// 打印起点坐标
double x = pageFormat.getImageableX(); //返回与此 PageFormat相关的 Paper对象的可成像区域左上方点的 x坐标。
double y = pageFormat.getImageableY(); //返回与此 PageFormat相关的 Paper对象的可成像区域左上方点的 y坐标。
// 虚线
float[] dash1 = { 4.0f };
// width - 此 BasicStroke 的宽度。此宽度必须大于或等于 0.0f。如果将宽度设置为
// 0.0f,则将笔划呈现为可用于目标设备和抗锯齿提示设置的最细线条。
// cap - BasicStroke 端点的装饰
// join - 应用在路径线段交汇处的装饰
// miterlimit - 斜接处的剪裁限制。miterlimit 必须大于或等于 1.0f。
// dash - 表示虚线模式的数组
// dash_phase - 开始虚线模式的偏移量
// 设置画虚线
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 4.0f, dash1, 0.0f));
// 设置打印字体(字体名称、样式和磅值大小)(字体名称可以是物理或者逻辑名称)
//Font.PLAIN:普通样式常量 Font.ITALIC:斜体样式常量 Font.BOLD:粗体样式常量。
Font font = new Font("宋体", Font.BOLD, 16);
g2.setFont(font); //设置字体
float heigth = font.getSize2D();//字体高度
float line = heigth;//下一行开始打印的高度
//设置小票标题
g2.drawString("【点餐分单】", (float)x+40, (float)y+line);
font = new Font("宋体",Font.PLAIN,16);
g2.setFont(font);
line =line+heigth*2;
//设置小票副标题
g2.drawString("桌号: 01号", (float)x, (float)y + line);
font = new Font("宋体", Font.PLAIN, 10);
g2.setFont(font); // 设置字体
heigth = font.getSize2D();// 字体高度
line +=heigth;
// 显示订单号
g2.drawString("订单编号:" + orders, (float) x , (float) y + line);
line+=heigth;
// 显示收银员
g2.drawString("下单时间:" + Calendar.getInstance().getTime().toLocaleString(), (float) x, (float) y + line);
line+=heigth;
g2.drawString("支付方式:" + payMode, (float) x , (float) y + line);
line+=heigth;
g2.drawString("支付金额:" + practical, (float) x , (float) y + line);
line += heigth;
//绘制虚线: (在此图形上下文的坐标系中使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。)
g2.drawLine((int) x, (int) (y + line), (int) x + 180, (int) (y + line));
line += heigth;
//显示标题
g2.drawString("品名", (float) x , (float) y + line+5);
g2.drawString("单价", (float) x + 60, (float) y + line+5);
g2.drawString("数量", (float) x + 100, (float) y + line+5);
g2.drawString("金额", (float) x + 150, (float) y + line+5);
line = line+heigth*2;
// 显示内容
for (int i = 0; i < list.size(); i++) {
Commodity commodity = list.get(i);
g2.drawString(commodity.getName(), (float) x, (float) y + line);
g2.drawString(commodity.getUnit_price(), (float) x + 60, (float) y + line);
g2.drawString(commodity.getNum(), (float) x + 100, (float) y + line);
g2.drawString(commodity.getSum(), (float) x + 150, (float) y + line);
line += heigth;
}
line += heigth;
//绘制虚线
g2.drawLine((int) x, (int) (y + line), (int) x + 180, (int) (y + line));
line = line+heigth*2;
g2.drawString("消费总金额:" + "¥" + sale_sum , (float) x+80, (float) y + line);
line = line+heigth*7;//空7行
g2.drawString("攸之源,健康美味之源!", (float) x + 40, (float) y + line);
line += heigth;
g2.drawString("横岗银信荣恒2楼", (float) x +50, (float) y + line);
line += heigth;
g2.drawString("0755-28912757", (float) x +50, (float) y +line);
switch (pageIndex) {
case 0:
return PAGE_EXISTS;//0
default:
return NO_SUCH_PAGE;//1
}
}
}
4. 打印结算单
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.standard.PrinterName;
/**
* 打印结算单
* @author admin
*
*/
public class PrintCheckOut {
//结算单,用于创建打印内容类
private CheckOutTicket salesTicket;
public PrintCheckOut(CheckOutTicket salesTicket) {
this.salesTicket = salesTicket;
}
/**
* 打印结算单
*/
public void PrintSale() {
try {
//Book 类提供文档的表示形式,该文档的页面可以使用不同的页面格式和页面 painter
Book book = new Book(); //要打印的文档
//PageFormat类描述要打印的页面大小和方向
PageFormat pf = new PageFormat(); //初始化一个页面打印对象
pf.setOrientation(PageFormat.PORTRAIT); //设置页面打印方向,从上往下
// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
Paper paper = new Paper();
paper.setSize(180, 30000);// 纸张大小
paper.setImageableArea(10, 0, 180, 30000);// A4(595x842)设置打印区域,其实0,0应该是72,72,因为A4纸的默认X,Y边距是72
pf.setPaper(paper);
book.append(salesTicket, pf);
//指定XP-80C打印机打印总单(可以省略,放在这里是为了实现多台打印机服务)
HashAttributeSet hs = new HashAttributeSet();
String printerName="XP-80C";
hs.add(new PrinterName(printerName,null));
PrintService[] pss = PrintServiceLookup.lookupPrintServices(null, hs);
if(pss.length==0)
{
System.out.println("无法找到打印机:"+printerName);
return ;
}
// 获取打印服务对象
PrinterJob printerJob = PrinterJob.getPrinterJob();
// 设置打印类
printerJob.setPageable(book);
//添加指定的打印机
printerJob.setPrintService(pss[0]);
//开始打印
printerJob.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}
}
5. 打印点餐单
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.standard.PrinterName;
/**
* 打印点餐单
* 用HP Color LaserJet Pro MFP M176n打印机
* @author admin
*
*/
public class PrintOrderDishes {
//售货单,用于创建打印内容类
private OrderDishesTicket orderFoodTicket;
public PrintOrderDishes(OrderDishesTicket orderFoodTicket) {
this.orderFoodTicket = orderFoodTicket;
}
/**
* 打印点餐单
*/
public void PrintSale() {
try {
//Book 类提供文档的表示形式,该文档的页面可以使用不同的页面格式和页面 painter
Book book = new Book(); //要打印的文档
//PageFormat类描述要打印的页面大小和方向
PageFormat pf = new PageFormat(); //初始化一个页面打印对象
pf.setOrientation(PageFormat.PORTRAIT); //设置页面打印方向,从上往下
// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
Paper paper = new Paper();
paper.setSize(180, 30000);// 纸张大小
paper.setImageableArea(10, 0, 180, 30000);// A4(595x842)设置打印区域,其实0,0应该是72,72,因为A4纸的默认X,Y边距是72
pf.setPaper(paper);
book.append(orderFoodTicket, pf);
//指定HP Color LaserJet Pro MFP M176n打印机打印总单(可以省略,放在这里是为了实现多台打印机服务)
HashAttributeSet hs = new HashAttributeSet();
String printerName="HP Color LaserJet Pro MFP M176n";
hs.add(new PrinterName(printerName,null));
PrintService[] pss = PrintServiceLookup.lookupPrintServices(null, hs);
if(pss.length==0)
{
System.out.println("无法找到打印机:"+printerName);
return ;
}
// 获取打印服务对象
PrinterJob printerJob = PrinterJob.getPrinterJob();
// 设置打印类
printerJob.setPageable(book);
//添加指定的打印机
printerJob.setPrintService(pss[0]);
//开始打印
printerJob.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}
}
6.测试类
import java.util.ArrayList;
import org.junit.Test;
/**
* 打印"点餐单"/"点餐单"测试(两台打印机)
* @author admin
*/
public class TestPrint {
@Test
public void test(){
ArrayList<Commodity> cmd_list = new ArrayList<Commodity>();
cmd_list.add(new Commodity("土豆", "5元", "2", "10"));
cmd_list.add(new Commodity("黄瓜", "5元", "2", "10"));
cmd_list.add(new Commodity("茄子", "5元", "2", "10"));
// 打印结算单
CheckOutTicket salesTicket = new CheckOutTicket(cmd_list,"000001", "3", "30", "30", "余额支付");
PrintCheckOut pintSale = new PrintCheckOut(salesTicket);
pintSale.PrintSale();
//打印点餐单
OrderDishesTicket oft = new OrderDishesTicket(cmd_list, "000001","30", "30", "余额支付");
PrintOrderDishes printOrderFood = new PrintOrderDishes(oft);
printOrderFood.PrintSale();
}
}