- Giao diện trực quan, dể sử dụng.
2.2.3 Nguyễn Phú Luật– Use case “In hóa đơn”
5) Giao diện vào/ra (Màn hình cài đặt)
Hình 2.6: Giao diện use case In hóa đơn
Khi người dùng nhấn vào nut “In hóa đơn” trên màn hình quản lý chính sau khi đã xem chi tiết hóa đơn. Hệ thống sẽ hiên thị ra một form in chọn máy in và kiểu in tương ứng ngay trên màn hình bằng một cửa sổ mới. Người dùng chọn máy in nhập trang in rồi nhấn nut “ok” hệ thống sẽ thực hiện in hóa đơn.
Hình 2.7: Mô tả các thành phần trên giao diện chức năng In hóa đơn
7) Mô tả thuật toán xử lý tương ứng với các tác động của người dùng.
• Khi người dùng bấm vào nút “In hóa đơn” thì hệ thống mở ra một cửa sổ với nội dung kiểu in cho người dùng thao tác.
Code:
Printer(tableCT,15,txtTongHoaDon.getText(),txtMa1.getText(),1) //đây là một đối tượng của lớp Printer để thực hiện lệnh in hóa đơn.
• Sau khi cửa sổ in hiện lên thì người dùng có thể thực hiện chức năng in hóa đơn đã xem chi tiết.
o In hóa đơn:
Code:
private void btnInMousePressed(java.awt.event.MouseEvent evt) { // TODO add your handling code here:
if(xemChitiet==false){
JOptionPane.showConfirmDialog(null, "Bạn phải xem chi tiết hóa đơn trước khi in.", "CHÚ Ý", JOptionPane.PLAIN_MESSAGE, HEIGHT);
}else{ btnIn.addActionListener(new Printer(tableCT,15,txtTongHoaDon.getText(),txtMa1.getText(),1)); } } Lớp Printer: Code:
JTable dgvhoadon=new JTable(); int FontHeight;
String tongtien; String maHoaDon;
public Printer(JTable dgvhoadon,int FontHeight, String tongtien,String maHoaDon,int nhap) { this.dgvhoadon=dgvhoadon; this.FontHeight=FontHeight; this.maHoaDon=maHoaDon; this.tongtien=tongtien; } @Override
public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
if (page > 0) { /* We have only one page, and 'page' is zero-based */ return NO_SUCH_PAGE;
}
/* User (0,0) is typically outside the imageable area, so we must * translate by the X and Y values in the PageFormat to avoid clipping */
Graphics2D g2d = (Graphics2D)g;
g2d.translate(pf.getImageableX(), pf.getImageableY()); /* Now we perform our rendering */
int startX = 20; int startY = 30; int offset = 40;
g.drawString("WAREHOUSE FASHION SHOP", startX, startY); String top = "Tên SP " + "Số lượng " + "Giá/1sp";
g.drawString(top,startX, startY + offset);
offset = offset + FontHeight; //Tạo khoảng cách thích hợp
g.drawString("--- ---", startX, startY + offset);
for(int i = 0; i < dgvhoadon.getRowCount(); i++) {
g.drawString(dgvhoadon.getValueAt(i, 0).toString(), startX, startY + offset);
g.drawString(dgvhoadon.getValueAt(i, 6).toString(), startX + 140, startY + offset);
g.drawString(DinhDangTien(Integer.parseInt(dgvhoadon.getValueAt(i, 5).toString())), startX + 250, startY + offset);
offset = offset + (int)FontHeight + 5; //Tao khoang cach giua cac cot }
offset = offset + 20; //Tao khoang cach giua phan tren va duoi g.drawString("Tổng tiền: ", startX, startY + offset);
g.drawString(tongtien, startX + 100, startY + offset); g.drawString("Ký tên", startX + 510, startY + offset);
offset = offset + (int)FontHeight + 5; //Tạo khoảng cách thích hợp g.drawString("Thành chữ: ", startX, startY + offset);
//Tính tiền int tong = 0;
for (int i = 0; i < dgvhoadon.getRowCount(); i++) {
tong += (Integer.parseInt(dgvhoadon.getValueAt(i, 5).toString()) * Integer.parseInt(dgvhoadon.getValueAt(i, 6).toString()));
}
g.drawString(chu(tong), startX + 100, startY + offset);
offset = offset + FontHeight + 5; //Tạo khoảng cách thích hợp g.drawString("Mã hóa đơn: " + maHoaDon, startX, startY + offset);
offset = offset + FontHeight + 5; //Tạo khoảng cách thích hợp
g.drawString("Cảm ơn bạn đã tới ủng hộ cửa hàng,", startX, startY + offset);
offset = offset + FontHeight + 5; //Tạo khoảng cách thích hợp g.drawString("Mong bạn sẽ quay lại sớm!",startX, startY + offset); /* tell the caller that this page is part of the printed document */ return PAGE_EXISTS;
}
@Override
public void actionPerformed(ActionEvent e) { PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(this);
boolean ok = job.printDialog(); if (ok) {
try {
job.print();
} catch (PrinterException ex) {
/* The job did not successfully complete */ }
} }
//Dinh dang tien va doc so thanh chu
public static String ReverseString(String s)//Hàm đảo chuỗi dùng cho tiendd bên dưới
{
String reverse = new StringBuffer(s).reverse().toString(); return reverse; // trả về chuỗi mới sau khi đảo mãng }
public static String DinhDangTien(int t) {
//
//Định dạng lại text của tổng tiền //
String tien = Integer.toString(t);
String tiendd = "";//Tien duoc dinh dang de hien thi trong o text (cho them dau ",")
int sodauphay = (tien.length() - 1) / 3;//So dau phay trong chuoi int dem1 = 0;//dung de dem cac dau phay duoc chen vao trong chuoi. int dem2 = 0;//dùng để thực hiện vc cứ ba chữ số thì sẽ chèn một dấu phẩy.
for (int i = tien.length() - 1; i >= 0; i--) { if (dem1 < sodauphay) { tiendd += tien.charAt(i); dem2++; if (dem2 == 3) { tiendd += ","; dem1++; dem2 = 0; } } else { tiendd += tien.charAt(i);
} }
tiendd = ReverseString(tiendd); return tiendd;
}
//Doc so thanh chu
public static String bachuso(int n) {
String s = "";
int donvi, chuc, tram;
String[] kyso = new String[] { "", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" }; donvi = n % 10; n /= 10; chuc = n % 10; tram = n / 10; if (tram > 0) { s += kyso[tram]; s += " trăm "; } if (chuc > 0) { if (chuc == 1) s += "mười "; else { s += kyso[chuc]; s += " mươi "; } } if (donvi > 0) {
if (chuc == 0 && tram != 0) s += "lẻ";
if (donvi == 1) s += "một";
else if (donvi == 5 && (chuc != 0 || tram != 0)) s += "lăm";
else if (donvi == 5 && (chuc == 0 || tram != 0)) s += "năm"; else s += kyso[donvi]; } return s; }
public static String chu(int n) {
String chuoi = "";
int donvi, ngan, trieu, ty; donvi = n % 1000; n /= 1000; ngan = n % 1000; n /= 1000; trieu = n % 1000; ty = n / 1000; if (ty > 0) chuoi += bachuso(ty) + " tỷ "; if (trieu > 0)
chuoi += bachuso(trieu) + " triệu "; if (ngan > 0) chuoi += bachuso(ngan) + " ngàn "; if (donvi > 0) chuoi += bachuso(donvi); return chuoi; } }
Hướng dẫn sử dụng các thư viện chuẩn.
Các thư viện chuẩn sử dụng trong use case này: import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.print.PageFormat; import java.awt.print.Printable;
import static java.awt.print.Printable.NO_SUCH_PAGE; import static java.awt.print.Printable.PAGE_EXISTS; import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
Giải thích ý nghĩa:
Thư viện java.awt.Graphics; java.awt.Graphics2D;
là thư viện dùng để định dạng và xác định tọa độ của các thành phần trong hóa đơn
Thư viện java.awt.event.ActionEvent; java.awt.event.ActionListener; là thư viện để lắng nghe và sử lý các hành động xác nhận và hủy in.
Thư viện java.awt.print.PageFormat; java.awt.print.Printable; java.awt.print.Printable.NO_SUCH_PAGE; java.awt.print.Printable.PAGE_EXISTS; java.awt.print.PrinterException; java.awt.print.PrinterJob;
dùng để thực hiện định dạng bắt lỗi và thực hiện việc in hóa đơn.