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