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

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

 

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

  

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

 

 

图1 程序运行界面

 

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

 

 一、需求分析

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

 

a. 向屏幕添加并绘制矩形和圆。

b. 可以用鼠标移动矩形和圆。

c. 采用图形界面完成绘图项目。

d. 程序应该具有可扩展性,例如可以增加绘制和处理三角形的功能。

 

二、系统设计

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

 

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

 

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

 

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

 

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

 

上述类和接口一共有5个:MyCircleMyRectangleIShapeMyShapeMyLocation,它们是可以用眼睛看得到的。

 

另外我们需要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包:所有接口放在这里。interfazeinterface的不同拼写,避免用关键词。

org.ngweb.drawing.shapes包:所有类和抽象类放在这里。

org.ngweb.drawing.manager包:管理类放在这里。

org.ngweb.drawing.view包:Painting类放在这里。

 

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

 

五、项目的实现

 

本项目分三个阶段实现,

绘图项目

用到的知识点

绘图项目(一)

类、接口、继承、多态、包

绘图项目(二)

容器APIList

绘图项目(三)

事件处理、按钮、绘图

 

具体的实现过程,见SWF视频材料:

 

第一阶段视频:点击观看 

  

 

 

第二阶段视频:点击观看

 

 

第三阶段视频:点击观看 

 

 

 

附录:资源下载地址

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

 

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

 

 

 

---------------------------- 全文结束-------------------------

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值