您的位置:首页 > 编程语言 > Java开发

用Java语言编写一个绘图项目的完整过程

2011-02-02 10:39 309 查看
Java语言是一个纯的面向对象的编程语言,如何用Java语言的面向对象的特点进行项目的设计和程序的编写呢?为了说明这个问题,这里提供一个小型项目的完整开发过程

为了更好地展现面向对象的特征,我用了一个最为经典的例子:形状接口、圆和矩形类所形成的类及其抽象和继承关系,以这些关系作为主线,来进行项目的设计。

我们先来看一下项目最终的成果,程序运行的屏幕截图如下:



图1 程序运行界面

也可以下载字节码文件,在你的计算机上运行(需要Java 5以上)。

一、需求分析

这个小型项目的需求非常简单,为客户设计一个图形绘制软件,要求如下:

a. 向屏幕添加并绘制矩形和圆。
b. 可以用鼠标移动矩形和圆。
c. 采用图形界面完成绘图项目。
d. 程序应该具有可扩展性,例如可以增加绘制和处理三角形的功能。

二、系统设计
一开始,我们就要用面向对象的思路来考虑,我们可以想象程序完成后,在屏幕有多个圆和矩形,这些圆和矩形就是对象,每个对象都有自己的属性,圆的属性是半径和本身所处的位置,矩形的属性是高、宽和本身所处的位置,不仅如此,每个对象还有行为,那就是能够在屏幕上绘制出自己,绘制的过程就是以自己的属性(半径、或高宽),在屏幕上的一定位置(位置属性的值)画出自己(圆或矩形)。每个对象也够按照要求移动自己,移动的过程是按要求将自己的位置属性值改为新的位置,然后再重新绘制自己。

根据上述思路,我们可以将所有的圆的对象抽象为一个圆类(MyCircle),将所有矩形的对象抽象为一个矩形类(MyRectangle)。

因为绘制和移动等行为是所有形状共有的行为,因此我们把抽象的程度提高一个层次,将这些不同类所共有的行为抽象出来,放在一个接口中,把它称为形状接口(IShape),这个接口指出所有的形状类都应该有的行为,从而规范圆和矩形类等的行为。

因为接口中的行为是没有实现的(它的方法都是抽象方法),不能实现代码的复用,因此我们还要把可以复用的代码(共用行为的实现)提取出来,放在一个抽象类中,这个抽象类称之为(MyShape)。

另外,对于形状的位置,可以用形状的中心点来表示,也可以用形状的左上角来表示,一般来说用左上角表示比较好。这个位置是一个2维坐标的点,因此,也可以把它抽象为一个对象(MyLocation),它的属性只有2个:x, y,表示点的坐标值,当然它还应该有相应的方法来访问这个坐标值。

上述类和接口一共有5个:MyCircle、MyRectangle、IShape、MyShape、MyLocation,它们是可以用眼睛看得到的。

另外我们需要2个类,这2个类是无法用肉眼看到的,但却可以感知得到。一个类用于管理所有的形状对象,将它称为形状管理器(ShapeMgr),可能在某一时刻有3个圆和2个矩形,另一时刻有3个圆和4个矩形,也就是说,当向屏幕添加一个形状的时候,实际上是向ShapeMgr添加一个形状。ShapeMgr还负责向它管理的形状发号施令,例如要求所有的形状重新绘制自己。

另一个类是代表了屏幕的类,也就是表示了绘图的空间,我们称之为画图板(Painting),它的外观见前述的图1。

如此一来,我们就有了7个类和接口,它们之间的关系如图2所示:




图2 项目类图

三、详细设计
1、接口IShape:
它声明了所有形状应该具有的行为:
计算面积:int area()
绘制自己:void drawing(Graphics g)
移动自己:void moveTo(MyLocation location)
判断是否点击了自己:boolean insideMe(int x, int y)
2、抽象类MyShape:
它声明了所有形状类共有的属性和可以复用的代码:
形状的位置信息:MyLocation location
移动方法对所有形状都是相同的:public void moveTo(MyLocation location)
3、位置类MyLocation:
它声明了位置类的属性和方法:
private int x;
private int y;
创建位置:public MyLocation(int x, int y)
设置新的坐标点:public void setMyLocation(int x, int y)
public int getX()
public int getY()
4、圆类MyCircle
它声明了圆类所独有的属性和方法
半径属性:int radius;
public int getRadius()
public void setRadius(int radius)
计算圆本身的面积:public int area()
绘制圆本身:public void drawing(Graphics g)
判断是否点击了圆本身:public boolean insideMe(int x, int y)
5、矩形类MyRectangle
它声明了矩形类独有的属性和方法:
二个矩形的属性:int width;
int height;
public int getWidth()
public void setWidth(int width)
public int getHeight()
public void setHeight(int height)
计算矩形本身的面积:public int area()
绘制矩形本身:public void drawing(Graphics g)
判断是否点击了矩形本身:public boolean insideMe(int x, int y)
6、形状管理器ShapeMgr
它声明了与管理形状有关的属性和方法:
用一个List保存所有的形状(圆、矩形或其它形状):private List<IShape> shapeList;
public ShapeMgr()
添加一个形状(圆、矩形或其它形状):public void addShape(IShape shape)
移除一个形状(圆、矩形或其它形状)public void removeShape(int shapeIndex)
统计含有多少个形状:public int size()
通过下标获得形状:public IShape getShape(int shapeIndex)
重新绘制所所形状:public void redrawing(Graphics g)
7、画图板Painting
它是GUI编程的主体,实现图形界面的编程

四、包的设计
org.ngweb.drawing.interfaze包:所有接口放在这里。interfaze是interface的不同拼写,避免用关键词。
org.ngweb.drawing.shapes包:所有类和抽象类放在这里。
org.ngweb.drawing.manager包:管理类放在这里。
org.ngweb.drawing.view包:Painting类放在这里。

org.ngweb.drawing.test包:可选地,把测试类放在这里。

五、项目的实现

本项目分三个阶段实现,

绘图项目

用到的知识点
绘图项目(一)
类、接口、继承、多态、包
绘图项目(二)
容器API(List)
绘图项目(三)
事件处理、按钮、绘图
具体的实现过程,见SWF视频材料:

第一阶段视频:点击观看

第二阶段视频:点击观看

第三阶段视频:点击观看

附录:资源下载地址
本文改编自作者出版的新书《Java程序设计及实训》,该书由机械工业出版社出版,主页为www.ngweb.org。详细内容见该网站,并可下载有关资源。

本文系原创,如果转载,请注明从CSDN转载,并保留上述资源下载地址。

---------------------------- 全文结束-------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: