网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  用java设计面向对象的打印程序     
  文章作者:未知  文章来源:水木森林  
  查看:66次  录入:管理员--2007-11-17  
 
用java设计面向对象的打印程序

张来东 (zhangld@mail.hf.ah.cn)

打印程序的编写通常采用结构化的编程的方法,按特定的位置和一定顺序将打印内容送往打印机。在采用java设计打印程序时仍然可采用结构化的方法,但是编写较为麻烦且代码不能重用,不是一种好的方法,给人一种"新瓶老酒"的感觉。目前为数不少的java书籍在介绍打印时,侧重介绍打印功能的实现,而打印用例的主要代码却是结构化的。java网站在介绍java打印功能时,实现打印的代码也是结构化的。

如果将打印内容进行对象化分析,设计出面向对象的打印程序,则会更出色地完成打印要求,并且代码很容易重用,事半功倍。(本文假定你已经了解java的打印功能)

一、打印对象的分析

打印通常包含以下基本内容:文字、线条、线框、图像等。比如一个表格是由若干文字、线条和线框对象其组成。为叙述简单,本文仅涉及以下三种对象。

文字对象的属性:文字内容,坐标,颜色,字体,对齐方式。

线条对象的属性:起点坐标,终点坐标,颜色,线宽。

线框对象的属性:左上角坐标,宽度,高度,线宽,颜色。

这些打印对象必须能根据属性将自己绘制出来。从另一个层面,可将打印的一页内容,理解为这些打印对象的容器。设计打印程序,只需将打印内容分解成适当的对象,由这些打印对象的集合来完成打印的要求。例如:打印普通表格。只需将表格分解成若开线框对象,线条对象,和文字对象。

二、打印对象的设计

设计思路:根据打印对象的分析,可以将打印的内容看成这些打印对象的集合。实际的打印就是将打印对象集合中的打印对象遍历,调用其print方法,因此这几类打印对象就需要封装相同的打印接口。

1、对象打印接口设计如下:

package lilidb;

import java.awt.graphics;

/**
*打印对象接口;
*一、文字对象。二、线条对象。三、线框对象。每
*种对象各有其属性,但都必须有print方法。
*/
public interface printobject{
/**
*打印或预览实际内容
*@param g 打印或预览的图形对象,根据是预览还是打印传入具体的graphics对象
*/
public void print(graphics g);
}



2、 文字打印对象的设计

为了叙述的简单,文中的打印对象,未加居中等处理。

package lilidb;

import java.awt.*;
import java.util.*;

/**
*打印文字对象
**/

public class printlabel implements printobject{

string label;
int px;
int py;
color color = color.black;
fontmetrics fm;
/**
*构造printlabel 对象,
*@param ls 标签内容。
*@param x 标签的x坐标
*@param y 标签的y坐标
*/
public printlabel(string ls,int x,int y){
label = ls;
px = x;
py = y;
range = 1;
}
/**
* 设置颜色
* @para colr 颜色值
*/
public void setrange(color colr){
color = colr;
}

/**
*设置标签字体
*@param fontn 字体名称
*@param type 字体类型 可选值为 font.bold,font.italic,font.plain
*@param size 字体象素尺寸
*/
public void setfont(string fontn,int type,int size){
font = new font(fontn,type,size);
}
/**
*设置标签位置
*@param x x坐标
*@param y y坐标
*/
public void setlabelposition(int x,int y){
px = x;
py = y;
}
/**
*设置标签内容
*@param ls 标签内容
*/
public void setlabelstring(string ls){
label = ls;
}
/**
*打印或预览实际内容
*@param g 打印或预览的图形对象
*/
public void print(graphics gg){
graphics2d g = (graphics2d)gg;
g.setfont(font);
g.drawstring(label, px, py)
}
}
}



3、 线条打印对象的设计

package lilidb;

import java.awt.*;
import java.util.*;
import java.awt.graphics2d;
import java.awt.graphics;

/**
*线打印对象
*主要打印线条,其打印位置、和线形可以设置
*/
public class printline implements printobject{
/**
*线的起点
*/
int startx;
int starty;
/**
*线的终点
*/
int endx;
int endy;
/**
*线长
*/
int linelong;
/**
*线宽
*/
float linewidth;
basicstroke bs;
/**
*构造线对象,确定位置
*@param sx 线起点x坐标
*@param sy 线起点y坐标
*@param ex 线终点x坐标
*@param ey 线终点y坐标
*/
public printline(int sx,int sy,int ex,int ey){
startx = sx;
starty = sy;
endx = ex;
endy = ey;
}
/**
*设置线宽
*@param w 线的宽度
*/
public void setwidth(float w){
linewidth = w;
bs = new basicstroke(linewidth);
}
/**
*@see printobject#print
*/
public void print(graphics g){
graphics2d g2d = (graphics2d)g;
g2d.setstroke(bs);
g2d.drawline(startx, starty, endx, endy);
}
}



4、线框打印对象的设计

package lilidb;

import java.awt.*;
import java.awt.print.*;
import java.util.*;
/**
*打印矩形对象,矩形对象一般用来组成表格,
*/
public class printrectangle implements printobject{

float linewidth;
basicstroke bs;
/**
*3d矩形
*/
public final static int rec3d = 0;
/**
*普通矩形
*/
public final static int recnormal = 1;
/**
*圆角矩形
*/
public final static int recround = 2;
int px;
int py;
int w;
int h;
/**
* x 方向圆倒角直径
*/
int ax;
/**
* y 方向圆倒角直径
*/
int ay;
int type;
boolean raised;
/**
*设置线宽
*@param w 线的宽度
*/
public void setwidth(float w){
linewidth = w;
bs = new basicstroke(linewidth);
}
/**
*构造矩形打印对象
*@param x 矩形左上角 x 坐标
*@param y 矩形左上角 y 坐标
*@param width 矩形宽
*@param height 矩形高
*/
public printrectangle(int x,int y,int width ,int height){
px = x;
py = y;
w = width;
h = height;
}
/**
*设置矩形类型
*@param t 矩形类型
*/
public void settype(int t){
type = t;
}
/**
*设置3d矩形类型
*@param r 是否升起
*/
public void set3dtype(boolean r){
raised =r;
}
/**
*设置圆角矩形的圆角
*@param xd x方向圆角直径
*@param yd y方向圆角直径
*/
public void setround(int xd,int yd){
ax = xd;
ay = yd;
}
/**
*@see printobject#print
*/
public void print(graphics gg){
graphics2d g = (graphics2d)gg;
g.setstroke(bs);
switch (type){
case rec3d:{
g.draw3drect(px, py, w, h, raised);
break;
}
case recnormal:{
g.drawrect(px, py, w, h);
break;
}
case recround:{
g.drawroundrect(px, py, w, h, ax, ay);
break;
}
}
}
}



5、 打印内容的基类的设计

基类必须具有要有一个打印对象的容器,程序中使用了vector对象。并且需要有将打印对象加入到容器中和取出的功能,具体设计如下:

package lilidb;

import java.util.*;
import java.awt.*;

public class pageprint {

/** 用来存储打印对象 **/
vector vc;

public pageprint() {
vc = new vector();
}
/**
*将 printobject 对象放入 vc 中
*@param po printobject
*/
public void putprinto(printobject po){
vc.add(po);
}
/**
*取出printobject
*@param i 在集合vc 中的序号
*/
public printobject getprinto(int i){
return (printobject)vc.get(i);
}

/**
* 遍历vc,执行每个printobject对象的print方面
* @param g 将要打印的图形环境
*/
public void print(graphics g){
int i = vc.size();
graphics2d g2d = (graphics2d)g;
for(int j=0;j<i;j++){
getprinto(j).print(g2d);
}
}
}



6、 实际打印类的设计

实际的打印类的设计,可根据实际需要而定,添加必要的功能,但必须封装printable接口并继承pageprint类,一般形式如下:

class printall extends pageprint implements printable {
public int print(graphics g, pageformat pf, int pageindex) throws printerexception {
super.print(g);
return printable.page_exists;
}
}



采用以上方法编写的代码均是可重用的,实际编写具体的打印程序时,只需要将打印的内容分解成相应的打印对象,然后将打印对象加入到容器中即可。既使用一个或多个printall对象(每个printall对象作为一页来处理),将分解的打印对象定义,设置相应的属性,然后使用printall.putprinto(printobject po)方法加入到容器中。这样编写打印程序就无需再考虑繁琐的逻辑了,只需分解对象,计算位置即可。是不是很爽呢?笔者在使用java开发一个金融项目时,就成功使用了上述技术,大大提高了工作效率。如需要更多的程序请和笔者联系,地址:zhangld@mail.hf.ah.cn

参考资料:

java平台上的打印:http://java.sun.com/printing/

java网站的打印用例:
http://java.sun.com/docs/books/tutorial/2d/printing/example-1dot2/shapesprint.java
http://java.sun.com/docs/books/tutorial/2d/printing/example-1dot2/simplebook.java

developerworks上文枫的《java打印程序设计》:
http://www-900.ibm.com/developerworks/cn/java/l-javaprint/index.shtml

作者简介:

张来东 java技术的爱好者,从jdk1.1开始,跟踪使用java语言开发软件(服务器端和客户端),在《网络世界》、《中国计算机报》、《计算机世界报》上发表了多篇java方面的技术文章。目前在中国人民银行六安市中心支行科技科工作。
联系地址:安徽省六安市人民路41号 中国人民银行六安市中心支行
邮编:237006
email: zhangld@mail.hf.ah.cn
zld@ah163.com
 
 
上一篇: 用jdo替代cmp的应用    下一篇: 用java线程获取优异性能(i)??介绍线程、线程类及runnable
  相关文档
循速渐进学用session bean(一) 11-17
java技术进阶 基于java的idea加密算法探讨 04-01
sun向jcp提交servlet3.0规范—jsr315 11-17
function 语句 11-16
从txt文件中读取数字 11-17
j2ee综合:java ee/j2ee面向对象编程之道 02-26
java语言中浅复制与深复制概念详细解析 11-22
敏捷开发的必要技巧:移除重复代码 11-17
将 java 应用程序迁移到 .net(1) 11-17
java嵌入式开发之j2me--六 11-17
java 在client/server 网络中的应用 11-16
回眸java10周年:j2ee从起源到目的二 11-17
使用spring mvc框架进行文件上传 11-17
ubuntu上利用subclipse访问svn 11-17
从xml到java代码的数据绑定之对象 11-16
01、《tij》为何要读这本书 11-17
用ant 开发 java 程序 11-17
将java编译为exe的几种方法 11-16
java开发精彩教程:jsf系列(一) 11-16
体验j2se 1.5新特性之装箱和拆箱 11-16
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息