用户: 密码: 答案:   我要注册   忘记密码

加入收藏  设为首页

开发文档

CNJM首页

业界新闻

手机软件

终端应用

资源下载

EclipseME

CNJM论坛

                 

频道列表

J2ME开发 176篇
服务器端开发 33篇
JAVA语言 71篇
游戏与图形 101篇
WindowsMobile开发 6篇
Symbian开发 61篇
Brew开发 36篇
其它开发平台 6篇

热点文章

Jakarta Commons H... 15252次
利用HttpClient获...  12001次
[原创]反编译器jad... 10933次
防止JAVA代码被反...  9062次
Java异常处理 7843次
看例子练apache co... 7764次
每个JAVA初学者都...  7637次
加密与数字签名 7626次
为测试 Java 应用...  7074次
用JAVA设计面向对...  6956次
Java网络编程笔记(1) 6888次
移动视频: QuickTi... 6731次

文章搜索

搜 索
按 照
频 道
  
用JAVA设计面向对象的打印程序
编辑:jax    审核:rocks    文章来源:CNJM论坛整理
关键词:无    发表日期:2002-12-19 18:05:21    浏览次数:6957次
本文版权归原作者,中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网<www.cnjm.net>
来自:http://www.cnjm.net/tech/article678.html

打印程序的编写通常采用结构化的编程的方法,按特定的位置和一定顺序将打印内容送往打印机。在采用JAVA设计打印程序时仍然可采用结构化的方法,但是编写较为麻烦且代码不能重用,不是一种好的方法,给人一种"新瓶老酒"的感觉。目前为数不少的JAVA书籍在介绍打印时,侧重介绍打印功能的实现,而打印用例的主要代码却是结构化的。java网站在介绍java打印功能时,实现打印的代码也是结构化的。
如果将打印内容进行对象化分析,设计出面向对象的打印程序,则会更出色地完成打印要求,并且代码很容易重用,事半功倍。(本文假定你已经了解java的打印功能)
一、打印对象的分析
打印通常包含以下基本内容:文字、线条、线框、图像等。比如一个表格是由若干文字、线条和线框对象其组成。为叙述简单,本文仅涉及以下三种对象。
文字对象的属性:文字内容,坐标,颜色,字体,对齐方式。
线条对象的属性:起点坐标,终点坐标,颜色,线宽。
线框对象的属性:左上角坐标,宽度,高度,线宽,颜色。
这些打印对象必须能根据属性将自己绘制出来。从另一个层面,可将打印的一页内容,理解为这些打印对象的容器。设计打印程序,只需将打印内容分解成适当的对象,由这些打印对象的集合来完成打印的要求。例如:打印普通表格。只需将表格分解成若开线框对象,线条对象,和文字对象。
二、打印对象的设计
设计思路:根据打印对象的分析,可以将打印的内容看成这些打印对象的集合。实际的打印就是将打印对象集合中的打印对象遍历,调用其print方法,因此这几类打印对象就需要封装相同的打印接口。
1、对象打印接口设计如下:

package lilidb;
import java.awt.Graphics;
JAVA手机网[www.cnjm.net]
/**
*打印对象接口;
*一、文字对象。二、线条对象。三、线框对象。每
*种对象各有其属性,但都必须有print方法。
*/
public interface PrintObject{
   /**
   *打印或预览实际内容
   *@param g   打印或预览的图形对象,根据是预览还是打印传入具体的Graphics对象
   */
   public void print(Graphics g);
}
2、 文字打印对象的设计
为了叙述的简单,文中的打印对象,未加居中等处理。

package lilidb;
import java.awt.*;
JAVA手机网[www.cnjm.net]
import java.util.*;
/**
*打印文字对象
**/
JAVA手机网[www.cnjm.net]
public class PrintLabel implements PrintObject{
   String label;
   int px;
   int py;
   Color color = Color.black;
   FontMetrics fm;
   /**
   *构造PrintLabel 对象,
   *@param ls  标签内容。
JAVA手机网[www.cnjm.net]
   *@param x   标签的X坐标
   *@param y   标签的Y坐标
   */
   public PrintLabel(String ls,int x,int y){
     label = ls;
     px = x;
     py = y;
     range = 1;
JAVA手机网[www.cnjm.net]
   }
   /**
   * 设置颜色
   * @para colr  颜色值
   */
   public void setRange(Color colr){
     color = colr;
JAVA手机网[www.cnjm.net]
   }
   /**
   *设置标签字体
   *@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){
JAVA手机网[www.cnjm.net]
       px = x;
       py = y;
   }
JAVA手机网[www.cnjm.net]
   /**
   *设置标签内容
   *@param ls  标签内容
   */
   public void setLabelString(String ls){
       label = ls;
   }
   /**
   *打印或预览实际内容
JAVA手机网[www.cnjm.net]
   *@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;
   /**
   *线的终点
JAVA手机网[www.cnjm.net]
   */
   int endX;
   int endY;
   /**
   *线长
   */
JAVA手机网[www.cnjm.net]
   int lineLong;
   /**
   *线宽
   */
   float lineWidth;
   BasicStroke bs;
   /**
   *构造线对象,确定位置
JAVA手机网[www.cnjm.net]
   *@param sx  线起点X坐标
   *@param sy  线起点Y坐标
   *@param ex  线终点X坐标
   *@param ey  线终点Y坐标
   */
   public PrintLine(int sx,int sy,int ex,int ey){
       startX = sx;
JAVA手机网[www.cnjm.net]
       startY = sy;
       endX = ex;
       endY = ey;
   }
   /**
   *设置线宽
   *@param w   线的宽度
   */
   public void setWidth(float w){
       lineWidth = w;
       bs  = new BasicStroke(lineWidth);
   }
   /**
   *@see PrintObject#print
JAVA手机网[www.cnjm.net]
   */
   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;
JAVA手机网[www.cnjm.net]
   /**
   *普通矩形
   */
   public final static int RECNORMAL = 1;
   /**
   *圆角矩形
JAVA手机网[www.cnjm.net]
   */
   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;
JAVA手机网[www.cnjm.net]
   }
JAVA手机网[www.cnjm.net]
   /**
   *设置矩形类型
   *@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);
JAVA手机网[www.cnjm.net]
 }
 /**
 *取出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;
JAVA手机网[www.cnjm.net]
   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;
JAVA手机网[www.cnjm.net]
 }
}
采用以上方法编写的代码均是可重用的,实际编写具体的打印程序时,只需要将打印的内容分解成相应的打印对象,然后将打印对象加入到容器中即可。既使用一个或多个PrintAll对象(每个PrintAll对象作为一页来处理),将分解的打印对象定义,设置相应的属性,然后使用PrintAll.putPrintO(PrintObject po)方法加入到容器中。这样编写打印程序就无需再考虑繁琐的逻辑了,只需分解对象,计算位置即可。是不是很爽呢?笔者在使用java开发一个金融项目时,就成功使用了上述技术,大大提高了工作效率。如需要更多的程序请和笔者联系,地址:zhangld@mail.hf.ah.cn
张来东
中国人民银行六安市中心支行
2002 年 12 月
来自:http://www.cnjm.net/tech/article678.html

相关文章
   暂无相关文章
最新评论
yzc01wind 在 2005-03-17 21:55:30 发表的评论:
不错了.
不过还有很多不明白的.
有没有更详细一点的了? 
kyx 在 2004-06-05 20:50:50 发表的评论:
请给个实际的例子 
citycowboy 在 2004-04-08 15:54:13 发表的评论:
很好,介绍的很详尽.谢谢!! 
zhang5254111 在 2003-07-28 12:45:46 发表的评论:
大大提高了工作效率。如需要更 打印程序的编写通常采用结构化的编程的方法,按特定的位置和一定顺序将打印内容送往打印机。在采用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
张来东
中国人民银行六安市中心支行
2002 年 12 月

多的程序请和笔者联系 
网站简介  |  关于版权  |  广告服务  |  网站地图  |  联系我们
Copyright © www.CNJM.net, All rights reserved
中国JAVA手机网 版权所有
ICP备案:京ICP备041452