




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java Programming 课程项目设计说明 MultiView Project 功能说明 MultiView Project 系统实现对成绩的统计,并通过直方图和饼图来显示统计 的结果,成绩数据可以从文件中载入,也可以进行增加、删除、清空等操作, 原始数据显示在面板左边;当成绩数据发生变化包括增加、删除和清空时,柱 状图、饼状图两种图形以及左边分数数据面板分别调整图形中色值区域和左边 数值。我们通过下面的 Project Demo 来说明项目的主要功能。 1.主界面: 界面分为上下两个面板,上面面板是包括四个命令按钮的工具条,分别为载 入、增加、删除和清空四个功能。成绩文件里面的数值示在左下方界面,右下面 面板显示相应的直方图和饼状图分布。 2. 主要功能概述 1) 点击“Load”按钮,加载成绩文件里面的数值并显示在左下方界面,同 时显示相应的直方图和饼状图; 2) 点击“Add”按钮,将增加新成绩到成绩文件中,修改左下方成绩和右 边直方图和饼状图分布; 3) 点击“Delete”按钮,将删除成绩文件对应成绩,修改左下方成绩和右 边直方图和饼状图分布; 4) 点击“Clear”按钮,清空面板左边的所有成绩,和右边的直方图和饼 状图信息; 3.详细说明各模块功能流程 3.1 载入功能 主要是用来加载数据文件,数据文件为文本文件,每行一个数据。 点击【load】按钮,选择路径找到 data.txt 文件,点击【打开】 ,用户可以通 过加载数据列表对存放在纯文本文件中的数据进行一次性导入。 显示如下: 面板的左边是加载进去的数据内容,面板右边是本项目实现对成绩进行统 计,并以柱状图和饼状图进行比例展示的功能。 程序将自动计算出 0-59,60-69,70-79,80-89,90-100 各分段的数据分布。按照 相应比例,分别画出对应柱状图和饼状图中的深蓝、浅蓝、绿色、粉红色和黄 色区域的面积大小。 3.2 增加数据 按钮 是对数据进行增添数据操作,当点击【add 】后,系统将弹出“请 输入整数值”对话框,用户可以输入一个或者多个数据,如果输入多个数据, 数据之间用逗号分隔。 当输入一个“89”数值之后,黄色在柱状图和饼状图的面积分布增加,其 他颜色可能发生相应变化。 加入“89”后 加入“89”前 3.3 删除数据 按钮 是对文件中数值进行删除操作,当点击【delete】弹出对话框 如下 在这个对话框里面输入相应的数值,比如“46”如果这个数值不在里面, 左边的数值不会发生人任何改变。右边的柱状图和条形码保持不变。 当输入包含在数值文件中的“78”时 图形相应就发生如下变化,左边数值中 78 已被删除,右边绿色区域代表 70- 79 区间的范围也减小,其他颜色也可能发生相应变化如下图所示: 3.4 清空数据 点击按钮 ,面板的所有数据将会被全部清空。显示为初始状态 no data。 设计说明描述 本项目实现对成绩进行统计并以柱状图和饼状图进行比例展示的功能,并在 程序中使用了观察者模式,当项目中数据发生变化时,将通知所有观察者数据 已发生变化并作出相应的调整。用户可以通过加载数据列表对存放在纯文本文 件中的数据进行一次性导入,程序将自动计算出 0-59,60-69,70-79,80-89,90-100 各分段的人数分布。当成绩数据发生变化时,变化包括增加删除和清空,界面 各图,包括柱状图饼状图两种图形控件以及分数数据面板分别调整图形中色值 区域与列表数据。 1.1 观察者模式整体结构说明 具体实现类图如下所示: Obversable-observers:ArrayList Observer -update():void DataModel-score:ArrayList -number:int-append(int):void -clear():void-delete():void-loadFile(File):void PieChart(饼 状 图 ) -update():void BarJPanel(柱 状 图 ) -update():void TextJPanel(分 值 面 板 ) -update():void-paintComponent():void -paintComponent():void JPanel -getJTextArea():TextArea -initialize():void-initialize():void -initialize():void 1 0* 观察者模式可类比为现实世界的观察行为,如被观察者 A 的某个数据发生 改变时,观察者做出某种响应。该例中,成绩数据作为被观察者,成绩数据发 生改变时,观察者们(界面元素)分别做出相应的变化。 程序中类与方法描述如下: Java 自带观察者模式,数据主体继承自 Obversable,所有观察者需要实现自 Observer.如 DataModel 类中: public class DataModel extends Observable public void load( String fileName ) throws FileNotFoundException public void append(int score) public void clear() public void delete(int score) 上述四个方法分别代表数据加载,数据增加,数据清空,数据删除。他们在 实现时由于主体数据改变需要调用父类中实现的 notifyObservers 方法来通知所 有观察者进行数据刷新操作。BarJPanel 与 PieChart 分别代表柱状图与饼状图。 如下两段代码所示,实现 Ovserver 方法中代码后,主体数据发生改变时会 调用到两类中的 update 方法,便可对界面进行重绘(调用父类 repaint 方法) 。 public class BarJPanel extends JPanel implements Observer Override public void update(Observable arg0, Object arg1) / TODO Auto-generated method stub if ( arg1 instanceof int) numbers = (int) arg1; this.repaint(); public class PieChart extends JPanel implements Observer Override public void update(Observable o, Object arg) / TODO Auto-generated method stub if ( arg instanceof int) numbers = (int) arg; this.repaint(); 成绩列表数据面板与上两种类似。 而程序的主界面 MainFrame 类则类似于控制器。在程序初始化阶段,执行下述 代码: /* * 构造器 */ public MainFrame() super(); initialize(); dataModel.addObserver(barChart); dataModel.addObserver(pieChart); dataModel.addObserver(textJPanel); 当程序启动时,会调用该构造器,便会将饼形图面板,柱行图面板以及分数数 据面板注册为 DataModel 数据的观察者。这样在 DataModel 发生改变时 (notifyObservers)时,三个面板界面都会得到刷新。 1.2 DataModel 数据类设计描述 DataModel 负责加载成绩数据,并将成绩数据统计到各个分段,例如当新增 一条 60 的记录时,便将 60-69 分数段的个数增加一个。DataModel 中的 numbers 变量负责记录各个分数段的个数。 private int numbers = new int5; 其中 numbers0代表 0-59 分数段,numbers1代表 60-69 分数段,numbers2 代表 70-79 分数段,以此类推。 increaseNumber 方法负责当新增一条记录时,决定哪个分数段的个数增加 1. private void increaseNumber(int score) int index = score / 10 - 5; if (index = 5) index = 4; else if (index 0) index = 0; numbersindex+; 例如新增一条 72 的记录则 index = 2,numbers 数组中 numbers2加 1,代表 70-80 的数量增加一条。decreaseNumber 方法与此类似。 1.2.1 load 方法 由于程序提供从文件加载的功能,该类中 load 方法便提供了这个可能性。 Java 内建的 Scanner 类可以方便的帮助读取文件中的以行存储的成绩数据。 public void load(File file) throws FileNotFoundException Scanner scan = new Scanner(file); while ( scan.hasNext() int score; score = scan.nextInt(); scores.add(score); increaseNumber(score); /下面 2 行代码通知观察者数据发生了变化 this.setChanged(); this.notifyObservers(numbers); 当文件中依然有内容时,循环遍历,将文件的每行数据读出并调用 increaseNumber 统计数据。 1.3 柱状图 BarJPanel 柱状图实际上为一系列的长方形构成的统计图。构造函数中初始化 JPanel 大小为宽 300,高 200。并设置为网格布局. private void initialize() this.setSize(300, 200); this.setLayout(new GridBagLayout(); 类中通过观察者模式传递成绩统计数据 numbers,便可将 DataModel 中的 数据通知该类。在类的主体 paintComponent 部分,先得到成绩一共被分为几个 等级。 double percent = new doublenumbers.length; 接着计算成绩分段中个数最多的。 int max = 0; for (int n : numbers) if ( max n ) max = n; 而后计算出各个分数段与个数最多的分数段的比例,得到的结果存放到 percenti中,方便后面画柱状图时决定他的高度。 for (int i=0; ipercent.length; i+) percenti = (double) numbersi) / max; 接着计算每个柱的宽度,与个数最多的分数段的高度 yHeight。后面将上面计 算的 percenti各个分数段与 yHeight 相乘便可得到每个柱状图的高度。 最后遍历 percent 将各个柱状图的起始点与宽高传入 fillRect 方法便可绘制一 个长方形柱状图。注意每个柱状图画完后,需要对柱状图的起始点左边进行位 移操作 int xWidth = (this.getWidth()-20) / percent.length; int yHeight = (this.getHeight()-20) ; int x = 10, y = yHeight+10; g.drawLine(x, y, x+ this.getWidth()-20, y); for (int i=0; ipercent.length; i+) int height = (int)(yHeight * percenti);/得到各个图的高度 g.setColor(colorsi);/获得颜色 g.fillRect(x, y-height, xWidth-5, height);/填充长方形, 长方形的左上 角起点位y-height x += xWidth;/x坐标产生位移 1.4 饼状图 PieChart 该类也是继承 JPanel 并重写 paintComponent 方法,与柱状图不同的是,饼 图描述的是各个分数段的占比情况,于是便需要计算各个分数段占所有成绩的 比例。通过该比例计算出所需的角度。 代码 for (int n : numbers) total += n; 方法计算成绩个数。 for (int i=0; ipercent.length; i+) percenti = (double) numbersi) / total; 计算出各个分数段所占的比例。 arcAngle = (int) ( -percenti * 360 ); 另外的,有了角度后便可以通过 g.fillArc(xCenter-radius, yCenter-radius, radius*2, radius*2, startAngle, arcAngle); 上面的方法填充弧形区域。得到饼状图。 1.5 分数文本面板 该面板也继承自 JPanel,但在初始化时,需要往其中添加 JTextArea 控件, 在数据发生改变时,通过调用 JTextArea 的 setText 方法更新其中的文本。 this.add(getJTextArea(), BorderLayout.CENTER);/添加文本面板 jTextArea.setText(str.toString();/更新文本 1.6 MainFrame 该类为程序主窗体,主要负责控制各个按钮的事件。下面几个方法中分别得 到四个按钮并各四个按钮添加事件 private JButton getJButtonDelete() private JButton getJButtonClear() private JButton getJButtonAdd() private JButton getJButtonLoad() 2.界面 GUI 设计描述 JPanel 为 Swing 中最基础的面板控件,我们可以自定义控件继承自 JPanel 类后,复写 paintComponent 方法,便可在程序运行时制定我们需要的效果。 MainFrame 类为程序主窗体,主要负责控制各个按钮的事件。 程序运行时,先调用 initialize 方法,生成一个内容面板,即 getJContentPane()获取到的控件。 主窗体采用 BorderLayout 方式布局: jContentPane.setLayout(new BorderLayout(); BorderLayout 将窗体分成东南西北中五个位置,如代码所示, jContentPane.add(getJPanel(), BorderLayout.CENTER); jContentPane.add(getJToolBar(), BorderLayout.NORTH); jContentPane.add(textJPanel, BorderLayout.WEST); 分别将统计图栏,工具栏,分数列表栏和放在中间位置,北位置和西位置。 而后程序调用下面几个方法中分别得到四个按钮并给四个按钮添加事件 private JButton getJButtonDelete() private JButton getJButtonClear() private JButton getJButtonAdd() private JButton getJButtonLoad() loadDataFile 方法负责生成一个文件选择对话框提供给用户选择数据文件。 private
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 产品经理与程序员的协作方式测试试题及答案
- 真实案例解析2025年VB试题及答案
- 面试中常见技术问题的解析试题及答案
- 网络运行维护常识试题及答案
- 未来五年内企业战略演变的趋势分析试题及答案
- 2025年软件开发技术试题及答案
- 软件项目风险评估与管理的方法试题及答案
- 2025年软考网络技术试题及答案
- 网络技术的演变试题及答案分析
- 2025年软件设计师考试相关法律法规试题及答案
- 店面出让股权协议书
- 英文电影鉴赏知到智慧树期末考试答案题库2025年北华大学
- 中外航海文化知到课后答案智慧树章节测试答案2025年春中国人民解放军海军大连舰艇学院
- 复调音乐巡礼-巴赫勃兰登堡协奏曲 课件-2023-2024学年高中音乐人音版(2019)必修音乐鉴赏
- 零信任网络安全架构
- 压力容器使用年度检查报告(范本)
- 实行保健食品制度
- Purchase Order模板参考模板
- VISIO图标大全(完整版)
- 退料作业流程(生产退料)
- 质量管理体系国家注册审核员培训教程课件
评论
0/150
提交评论