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

来源:互联网 发布:淘宝新店如何找货源 编辑:程序博客网 时间:2024/05/18 00:33

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岁宝宝又吐又拉怎么办 u盘坏了怎么办没反应了 怀孕了不知道孩子是谁的怎么办 怀孕八个月耻骨疼的厉害怎么办 没感情了这段婚姻该怎么办 1岁半宝宝o型腿怎么办 4s店没按时交车怎么办 几天几夜睡不着觉没有睡意怎么办 辣的吃多了胃疼怎么办 喉咙痛怎么办有最好即简单好得快 减肥过后皮肤留下的肥胖纹怎么办 用了完美玛丽艳脸上长痘痘怎么办 腰疼怎么办8方法解决腰疼 红米3x开不了机怎么办 苹果手机忘记了锁屏密码怎么办 小米5的4g网速慢怎么办 红米4a卡机了怎么办 信而富逾期3个月怎么办 苹果6锁屏密码忘了怎么办 孕8个月咳嗽有痰怎么办 微信红包输了6万怎么办 红米3s开不了机怎么办 核载5人载了6人怎么办 我欠支付宝2万6怎么办 我47岁这个月经不来怎么办 两个月不来月经了也没怀孕怎么办 婴儿不吃奶粉母乳又不够吃怎么办 怀孕39周了还没反应怎么办 脸过敏了又红又痒怎么办