专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » java面向对象编程:用JAVA设计面向对象的打印程序 »正文

java面向对象编程:用JAVA设计面向对象的打印程序

来源: 发布时间:星期五, 2009年4月3日 浏览:0次 评论:0
用JAVA设计面向对象打印JAVA中文站社区门户w(w"W^4w+f\
JAVA中文站社区门户zc&b4s,H0J7A-v8o
张来东 ([email protected])JAVA中文站社区门户X b1xvD]7g
JAVA中文站社区门户C8qifd$yok^S3T
打印编写通常采用结构化编程思路方法按特定位置和定顺序将打印内容送往打印机在采用JAVA设计打印时仍然可采用结构化思路方法但是编写较为麻烦且代码不能重用不是种好思路方法,给人种"新瓶老酒"感觉目前为数不少JAVA书籍在介绍打印时侧重介绍打印功能实现而打印用例主要代码却是结构化java网站WebSite在介绍java打印功能时实现打印代码也是结构化JAVA中文站社区门户0a)R)M w.ns
JAVA中文站社区门户1H.{&l2q+`lQpw? Z
如果将打印内容进行对象化分析设计出面向对象打印则会更出色地完成打印要求并且代码很容易重用事半功倍(本文假定你已经了解java打印功能)
m g^Htt
Nma?1\rn、打印对象分析
&p/pkq hJ^$DR}"XSJAVA中文站社区门户i[6_0C"p(w,v0c
打印通常包含以下基本内容:文字、线条、线框、图像等比如个表格是由若干文字、线条和线框对象其组成为叙述简单本文仅涉及以下 3种对象JAVA中文站社区门户n(q0G)}(VExp I

t5\U Z1x0{)s文字对象属性:文字内容坐标颜色字体对齐方式
"CBy |-_9q'C
~'Uz]HT'V xE线条对象属性:起点坐标终点坐标颜色线宽
$w$K5k7R~8^f2g qWcJAVA中文站社区门户/u&l.rS$e["c@
线框对象属性:左上角坐标宽度高度线宽颜色
D2P2sY/tQV#WJAVA中文站社区门户6A,Z#Cu@i&T
这些打印对象必须能根据属性将自己绘制出来从另个层面可将打印页内容理解为这些打印对象容器设计打印只需将打印内容分解成适当对象由这些打印对象集合来完成打印要求例如:打印普通表格只需将表格分解成若开线框对象线条对象和文字对象
)ld Sa4a#\JAVA中文站社区门户J3T Ad?.hz
2、打印对象设计JAVA中文站社区门户 M2?9yH6g.B7z
JAVA中文站社区门户,pPB2E kF:D9VBU
设计思路:根据打印对象分析可以将打印内容看成这些打印对象集合实际打印就是将打印对象集合中打印对象遍历其pr思路方法因此这几类打印对象就需要封装相同打印接口JAVA中文站社区门户9Q$wo\Q
JAVA中文站社区门户W;^ PVZ}sr
1、对象打印接口设计如下:
+_,c2PQc*B LJAVA中文站社区门户0|C[#~$c
JAVA中文站社区门户%G [.[j}*N s9V:nd
package lilidb;JAVA中文站社区门户-z8V:DI9`1@U,v

su(RTM;k}C J:m(~:simport java.awt.Graphics;JAVA中文站社区门户 m5[,j9t*OWc_2V
JAVA中文站社区门户m#M+[2iU
/**JAVA中文站社区门户9` Y${0[K%J;FN
*打印对象接口;JAVA中文站社区门户:el9C:I:fd
*、文字对象 2、线条对象 3、线框对象JAVA中文站社区门户g\WK}T QR#g
*种对象各有其属性但都必须有pr思路方法JAVA中文站社区门户)e~ h Nw9Zy%X"}0jS
*/
{8iD OMpublic erface PrObject{JAVA中文站社区门户 h9bngG zy0_2F!@
/**JAVA中文站社区门户vpRE!gx*OcQ%W
*打印或预览实际内容JAVA中文站社区门户b2^*xb!L[
*@param g 打印或预览图形对象根据是预览还是打印传入具体Graphics对象JAVA中文站社区门户M%]+s c@'m\
*/
r7\'YKg,T%_Sifkpublic void pr(Graphics g);JAVA中文站社区门户@3j ^4M ~E'E2eC
}
E8BvCLyZ u cU\JAVA中文站社区门户,^S7xil+G&^

2syc4q!]'t"MG
t9c$OwV UbW:aJAVA中文站社区门户+Y%a`:k?m_S4q
2、 文字打印对象设计
!fM#w ^3@+AJAVA中文站社区门户8v4D)d6}#ig%F
为了叙述简单文中打印对象未加居中等处理JAVA中文站社区门户)rx7~ T8Fvg
JAVA中文站社区门户$vGpF#]$M

o t;Urd Q j2bpackage lilidb;JAVA中文站社区门户,^.R3z7p`
JAVA中文站社区门户4b5u6G:H u5N
import java.awt.*;
!koXF [%e._import java.util.*;
h]Q\ n-u-?i(@)z
.}ei+E4f2V }/**JAVA中文站社区门户p#C^!Z _PO"[
*打印文字对象
\0dg#d0Nn%R5M**/
U {,GEqoc[[V9[3C
!ZB(]5ShF$_public PrLabel implements PrObject{
+qA%D ?8SJAVA中文站社区门户GZv^.d1X2rQ7G"r6S
String label;JAVA中文站社区门户*h{3z"T$jkI
px;
:cb }y u7p;zI} py;JAVA中文站社区门户i&s7ey&h
Color color = Color.black;
+qv-R$W6t"}FontMetrics fm;
D3H\'Q8b*Hy`3w s8| Q/**
$g$i R;DJm*构造PrLabel 对象JAVA中文站社区门户2h ~fH!Vq6qM2RXf
*@param ls 标签内容JAVA中文站社区门户.dy/o.G|7}
*@param x 标签X坐标
i G2d f-EhD{^H v*@param y 标签Y坐标JAVA中文站社区门户;\lfQ'IKp
*/
%|'f d vfpublic PrLabel(String ls, x, y){JAVA中文站社区门户^5f,V2c&DIpAw su
label = ls;
+Olvr e%d$Ypx = x;
#Q0i'u"Ml U^}d;Npy = y;
.qu G r#\{*girange = 1;JAVA中文站社区门户4|:_yS/wX;@*[y
}
,]4xi Cy/**JAVA中文站社区门户'VI],r;l-q&R;d#D
* 设置颜色
c1Z F]et%])M* @para colr 颜色值JAVA中文站社区门户-\g H&jQ'G1C-L\
*/JAVA中文站社区门户H II|O#A4X Y
public void Range(Color colr){
igJ W/Tcolor = colr;
V+MuoOlAN}JAVA中文站社区门户T Qg:r/` LX BO4_O @
JAVA中文站社区门户v J E*O _z
/**JAVA中文站社区门户.i"^{:E6D
*设置标签字体
a jg5xLE(P*@param fontn 字体名称JAVA中文站社区门户l'zvN0|!F)L R ? c
*@param type 字体类型 可选值为 Font.BOLD,Font.ITALIC,Font.PLAINJAVA中文站社区门户;w\+i$q9v1Ig|!o#Xx G
*@param size 字体象素尺寸JAVA中文站社区门户0j.}6x6{f@
*/JAVA中文站社区门户$kv? uP6n
public void Font(String fontn, type, size){JAVA中文站社区门户9J/yoc~$a
font = Font(fontn,type,size);JAVA中文站社区门户eHqhEN-SR:f
}JAVA中文站社区门户!`G"k*@"u*}?
/**
:S?Zp3kz*设置标签位置JAVA中文站社区门户6F8S}dTPcE| y.n'oh
*@param x x坐标JAVA中文站社区门户"_I6LY9x
*@param y y坐标
7S cFJ:z-Cq*/
;y;}N]#P#C%|NK jpublic void LabelPosition( x, y){
'X,Xr@i5\1N G&vpx = x;
.s4uio\py = y;JAVA中文站社区门户"y o5z+Q,e L"q
}
8?_.{:M-I6w8G[:`P/**JAVA中文站社区门户~6NnY(T9c,?.j4T
*设置标签内容
t:\Xg\ zJ)E~*@param ls 标签内容
Ta/HIQ!fk%cis*/
zQ?"]w:NoA4Bpublic void LabelString(String ls){JAVA中文站社区门户;QuXIKo3n dN
label = ls;
Yf2FHv!}4n}JAVA中文站社区门户a,W.j e;L{
/**
%fX_`'y&Z,nr ~*打印或预览实际内容
K ]s+IJ*@param g 打印或预览图形对象
8neREM-t-@m"n*/
KK/[#hz`*P#j6V!Gpublic void pr(Graphics gg){
/v7l*tucNGraphics2D g = (Graphics2D)gg;
pe(jg1|9~F2HM;eg.Font(font);
?N_3s(XQ ]Zg.drawString(label, px, py)JAVA中文站社区门户d X/i!O Hg
}JAVA中文站社区门户5]0_R Wf:`
}JAVA中文站社区门户`L tE!j
}JAVA中文站社区门户2Wq8X.?E%X;@
JAVA中文站社区门户 Z&a w/j4k

S ]-W?!C@ncE
7{.]/[I7OJAVA中文站社区门户-A s&~3I RY*Np r~1X
3、 线条打印对象设计JAVA中文站社区门户D.qt G g

S&y zo:q4KTJAVA中文站社区门户d Y G3?og
package lilidb;JAVA中文站社区门户s%pKW!ml

!poNE3ghj4pDimport java.awt.*;JAVA中文站社区门户-Af X3`6K
import java.util.*;JAVA中文站社区门户;HI4b!l"ZXK
import java.awt.Graphics2D;
L;Io"F%y g&^import java.awt.Graphics;
5by){5i!qz7n
^ib^`H5G/**
4l3f1r&j;JwTxl;?W2rF*线打印对象
$}jx2[ US*主要打印线条其打印位置、和线形可以设置JAVA中文站社区门户#J.fx&s^:cj5c:kvk
*/JAVA中文站社区门户 R!P5nZ0GD E
public PrLine implements PrObject{
sAib%NMo/**JAVA中文站社区门户(j7L:Ek]2I5_Clx
*线起点
7m xFv;W`"~3IY G*/JAVA中文站社区门户"[Z;eI4I q~1F
startX;JAVA中文站社区门户 d~&i3Ld*|&s&~4d1f
startY;
?:C2Ox9Ho/**
8l2us3J4W{*线终点JAVA中文站社区门户{.Z*W] zY
*/
z4|&U1qqP8y endX;
)_BNs6] endY;
A]miA/**
`D0l4m UrN*线长
+ofE7Gd j:R*/JAVA中文站社区门户+srPY8C
lineLong;JAVA中文站社区门户r9k W2Fx1p
/**
J(P*]%e6Y3f$[,}*线宽
k["Z?+@D5k9a%{*/
"^&q'M1_ Q.f'Vfloat lineWidth;JAVA中文站社区门户p^1h_fEW&B
BasicStroke bs;
w*LU)n1ot/**
.DHj^4{8~*构造线对象确定位置JAVA中文站社区门户m;s:c6|T ~JR"n{*g M
*@param sx 线起点X坐标JAVA中文站社区门户M;^bIR(]k_T
*@param sy 线起点Y坐标JAVA中文站社区门户x7r6zs+o QV_
*@param ex 线终点X坐标
0J.M"a1it9z s2v[.O*@param ey 线终点Y坐标
F"Kz G:W us*/JAVA中文站社区门户/\N*G`a KXb2U
public PrLine( sx, sy, ex, ey){
l"POi8@ K _*NstartX = sx;
4YKOm*MstartY = sy;JAVA中文站社区门户q.h EhV{s)S;@P
endX = ex;
Z$QfUGp'M@endY = ey;JAVA中文站社区门户n1e#\J"e)dM
}
}1Wo"wpE/**JAVA中文站社区门户4d6Z JE,O!L0Xyj
*设置线宽
$`)Q\X,H9Yp(w*@param w 线宽度JAVA中文站社区门户,y#SQvpz@\
*/JAVA中文站社区门户&CD0pXelx
public void Width(float w){
nnY DME~7BlineWidth = w;
XUg]3^Zy _(Jbs = BasicStroke(lineWidth);JAVA中文站社区门户] Hb Fu-G*dt
}JAVA中文站社区门户_ mt5z!G3^+B"L:w2q
/**
_-U@!_U` IKH-_*@see PrObject#pr
L2W X1`0OR*/JAVA中文站社区门户 Y}gqAh?&}N
public void pr(Graphics g){
o BHpzVy-nGraphics2D g2d = (Graphics2D)g;JAVA中文站社区门户8] J8rJ/K|T%h0K!{
g2d.Stroke(bs);JAVA中文站社区门户] oh?NZ.{6z y
g2d.drawLine(startX, startY, endX, endY);
ulM \'qv}
w8S#J4~4d}
f:eIk pTM
h(I.PZEuz
/T Pn%uC.J,V@9cJAVA中文站社区门户#yk(Y{3\Mk!N_t
JAVA中文站社区门户R6y:FF1eH ~hj RX
4、线框打印对象设计JAVA中文站社区门户%o` Yj#c p

vat"~ Y"tv^JAVA中文站社区门户6?R+Dv4I:]7Z \,U Qy
package lilidb;JAVA中文站社区门户5o WS&t^F5U*X
JAVA中文站社区门户aYo6[L }"O\
import java.awt.*;
-B\q,qm,Limport java.awt.pr.*;
WTV\0cd:ucimport java.util.*;JAVA中文站社区门户~)b(V:o8B
/**
)w VyQ%qj*打印矩形对象矩形对象般用来组成表格JAVA中文站社区门户5E_4D-w;GHV(I1I`
*/
7H'r2B#T0hp`public PrRectangle implements PrObject{
$vO:s R;m
xq/\C(Nh Ofloat lineWidth;JAVA中文站社区门户 }5R4V$v i
BasicStroke bs;JAVA中文站社区门户ws.cqt7[u7l~
/**JAVA中文站社区门户+S5a.jlN,Z4g
*3D矩形JAVA中文站社区门户L wXPa;f|.x5h
*/
x9A2U} lv#Mpublic final REC3D = 0;JAVA中文站社区门户:ho7i*F5Y7fkG e$C
/**JAVA中文站社区门户GCe"o0? ` I F
*普通矩形JAVA中文站社区门户@"Gf4[+q x
*/
(tan(oO:Gpublic final RECNORMAL = 1;JAVA中文站社区门户TA"JzJ8n
/**JAVA中文站社区门户0` CQG~
*圆角矩形
z:N$Q;l)xya8n h5mj*/JAVA中文站社区门户r;lMJg7@
public final RECROUND = 2;
5B@,]P.[Mj0U px;
}o:| i.H9G'G} py;JAVA中文站社区门户B O(z2Gd/_-j2O z
w;JAVA中文站社区门户&Y W? l n:^8N
h;JAVA中文站社区门户L%[LjF |8Q)[ y
/**JAVA中文站社区门户6LNh\Q;`8~H:a#I
* x 方向圆倒角直径
6_@9\5C1}([7j8n1j5f%c*/JAVA中文站社区门户xx"rh8k9`s
ax;JAVA中文站社区门户2@}W!jf'qWE;I&u
/**JAVA中文站社区门户+}G mA9tpti
* y 方向圆倒角直径JAVA中文站社区门户s\%W'Hl0jL
*/
Iw(e7e({)x E5Ra ay;
1W}_(W\)dcF type;JAVA中文站社区门户 d4q o?k7Q"e;I/g6T
boolean raised;JAVA中文站社区门户1\N0m m p
/**
u4{F]0]Qf%{:D6@k*设置线宽
{ n5p m#E/F*@param w 线宽度JAVA中文站社区门户U r~+S5N
*/JAVA中文站社区门户$fs8e+{-bU3S^V
public void Width(float w){
gy:JjC$x3BlineWidth = w;
hk!U{:vg*jO0}bs = BasicStroke(lineWidth);JAVA中文站社区门户-p/nz.@2k4II1_!_q
}JAVA中文站社区门户 h5V_G M
/**JAVA中文站社区门户 hL1~$E mwHX t@
*构造矩形打印对象JAVA中文站社区门户R lMU G!sIS
*@param x 矩形左上角 X 坐标JAVA中文站社区门户!EQ}&pG9kn c
*@param y 矩形左上角 y 坐标
rQXE#gk ?5ei*@param width 矩形宽JAVA中文站社区门户n,N e9hT2w-u5@[
*@param height 矩形高JAVA中文站社区门户ME$fG3l#L3n
*/
2g ?"m2G`.SCe"a c l~public PrRectangle( x, y, width , height){
{SsG|A R l/y.y!aVpx = x;JAVA中文站社区门户9@w7f4xy
py = y;
:r g q#jy`] Q5{w = width;JAVA中文站社区门户J\H5fU6aa
h = height;
)c0X.p ss'pdK}JAVA中文站社区门户C rX`"^
/**
6~#^c)g Y*设置矩形类型
mY8}QcI*x*@param t 矩形类型
$R2M2G ner9p'f \*/
'wAf9}/n+[public void Type( t){
-gh)[;c'R }Ktype = t;
\$q/Kf(K;Fv}
%GI6]8]bB4A1IEH/**JAVA中文站社区门户6v$j$M?0c;Ak2@8S
*设置3D矩形类型
+]x4_LM(X5M5Eu*@param r 是否升起
vU%D&@KC+V*/JAVA中文站社区门户+G)fxa-d!XvT C5N
public void 3DType(boolean r){JAVA中文站社区门户7Q/N/o5D9iuc#w
raised =r;JAVA中文站社区门户\ kN\4H-Q#`x n O
}JAVA中文站社区门户:o7e]:A7CJQH
/**
_'{!u#{D0\ H*设置圆角矩形圆角JAVA中文站社区门户DY)N*n z Y4OQ[)N }
*@param xd x方向圆角直径
(|b#{;{x.e'Z)m%\+@s*@param yd y方向圆角直径
bJD} A8v$_*/JAVA中文站社区门户1O)qv9}@+WVss
public void Round( xd, yd){JAVA中文站社区门户,G FyC.N
ax = xd;
|"E1Z[)U^!nay = yd;
O iz(`V'e5nr}JAVA中文站社区门户BvMvVZ
/**
,{*Et9q(E!d*@see PrObject#prJAVA中文站社区门户(R}(Z&MQM
*/JAVA中文站社区门户rx iCK6`
public void pr(Graphics gg){
3Zo^f9l,` x-iGraphics2D g = (Graphics2D)gg;
6r7h-m/SH"Vg.Stroke(bs);JAVA中文站社区门户eWhd'Kn]
switch (type){
V2Z g&R5H REC3D:{
(f.b^iz)P)h-G0A}g.draw3DRect(px, py, w, h, raised);JAVA中文站社区门户4g3QT1G+]
;JAVA中文站社区门户,N/Weu"lS;Y
}
C0[)K3lH TuP0Q RECNORMAL:{
*R-V~ P/elEg.drawRect(px, py, w, h);
%Qp&c9`1`^#\!B;
4m&o"H5C&g t+`}+{}JAVA中文站社区门户^#sg5^_6H'^
RECROUND:{JAVA中文站社区门户;t1ot%h,]
g.drawRoundRect(px, py, w, h, ax, ay);JAVA中文站社区门户v^ o3j/FG
;
)|(b0rGqs q;{m8k}
a%K"`1{AOfx}
EWa:}YoPAW}JAVA中文站社区门户 Tj\[*ZT ^8}4{z
}JAVA中文站社区门户gA`)wB
JAVA中文站社区门户;h.ncG.H4s3K4L
JAVA中文站社区门户*R%{3lP%E |G2C
JAVA中文站社区门户9Z4~DK+t

eNE9YF0f/Z!w5、 打印内容基类设计
W(y6l j%lt1h&]3kJAVA中文站社区门户'y \h-a Em|
基类必须具有要有个打印对象容器中使用了Vector对象并且需要有将打印对象加入到容器中和取出功能具体设计如下:JAVA中文站社区门户}8qGQ~\EO

o c-J!Oa kFCJAVA中文站社区门户 SO@e_qb5s:Za(~
package lilidb;
~^"~6g}'f~ y~JAVA中文站社区门户HA|3C+h%V
import java.util.*;JAVA中文站社区门户W,N~*z{ zw
import java.awt.*;JAVA中文站社区门户&Uq q9hC6c"fD#M
JAVA中文站社区门户Rd E O[#T(M|6S
public PagePr {JAVA中文站社区门户E!}(Qy,QZ~Y

VT/F#^u/** 用来存储打印对象 **/JAVA中文站社区门户"v [fs2J KV} K _._
Vector vc;
mK"w%A#aj5myJAVA中文站社区门户8kMm8Bi
public PagePr {
A t.eAg TpFn,kvc = Vector;JAVA中文站社区门户"USp k7n y%a
}JAVA中文站社区门户b pmB3T0s*CCa9\
/**
6}7p^.A5I ]*将 PrObject 对象放入 vc 中JAVA中文站社区门户`+IMB%a}e nRl
*@param po PrObjectJAVA中文站社区门户$M2y6F TQ wd8h
*/
i2H7L2X*W/y{T9}'pKpublic void putPrO(PrObject po){JAVA中文站社区门户0m-]@v/[8m t|
vc.add(po);
0G"lP4t n6g}JAVA中文站社区门户s+@-_7c1R1m-a"A
/**JAVA中文站社区门户%Y"sa$l]{R2X6{x
*取出PrObjectJAVA中文站社区门户,{~(RC n Q
*@param i 在集合vc 中序号
2CX0t(Ho UE6N"TZ*/JAVA中文站社区门户2W:w}CDoCq6PFy
public PrObject getPrO( i){JAVA中文站社区门户6O&?"r.qDY
(PrObject)vc.get(i);
:G-_] Yf"`/}}JAVA中文站社区门户:H!c&W}"wzd)Zj^f
JAVA中文站社区门户0R"K)u MPl
/**JAVA中文站社区门户"{5u%rB1pk6P7ao8J
* 遍历vc,执行每个PrObject对象pr方面
y,x}eg dO[* @param g 将要打印图形环境JAVA中文站社区门户w,TT S-_0_2^W
*/
S6]b3^ o*@public void pr(Graphics g){
2sZ]f.C8Y C`v$d i = vc.size;JAVA中文站社区门户q([3g:|-zoK
Graphics2D g2d = (Graphics2D)g;
$oH?:@ sn'{6Sfor( j=0;j<i;j){JAVA中文站社区门户t`YCnB3k
getPrO(j).pr(g2d);
]0{U8V j)A;Pm}
DvC+ih$H}JAVA中文站社区门户+L2R5c~7y8I
}JAVA中文站社区门户 DvX$Um+g

J2[3kbxbv.J/IJAVA中文站社区门户 @2V[*S8H

R Iu X@JAVA中文站社区门户#}"s k;{k4YB
6、 实际打印类设计JAVA中文站社区门户lYT9q}b(^*PG

dW/\W/Ib'?|f实际打印类设计可根据实际需要而定添加必要功能但必须封装Prable接口并继承PagePr般形式如下:
1pZ Obo w[V5\CrJAVA中文站社区门户.Sl*p~4B|
JAVA中文站社区门户/L^5E)g/iaD:X
PrAll extends PagePr implements Prable {
k+m"fl3bD%tP [public pr(Graphics g, PageFormat pf, pageIndex) throws PrerException {JAVA中文站社区门户?(f:|*Y u"ACCP o6NQ
super.pr(g);JAVA中文站社区门户6V?"?-\!r!oX+Q
Prable.PAGE_EXISTS;
Z{4~ j/t$xZ}JAVA中文站社区门户6}7L`5U6oE8{.R
}
6^7VXks-NdJAVA中文站社区门户x]W9i }-N

1L1B!m4` t!uJAVA中文站社区门户Q$l+E[3uvRpp

p-X?-ief GVQ采用以上思路方法编写代码均是可重用实际编写具体打印只需要将打印内容分解成相应打印对象然后将打印对象加入到容器中即可既使用个或多个PrAll对象(每个PrAll对象作为页来处理)将分解打印对象定义设置相应属性然后使用PrAll.putPrO(PrObject po)思路方法加入到容器中这样编写打印就无需再考虑繁琐逻辑了只需分解对象计算位置即可是不是很爽呢?笔者在使用java开发个金融项目时就成功使用了上述技术大大提高了工作效率如需要更多请和笔者联系地址:[email protected]

TAG: Java JAVA java 打印 面向对象 设计
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: