《Java Programming课程项目设计说明—MutiView.doc》由会员分享,可在线阅读,更多相关《Java Programming课程项目设计说明—MutiView.doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java Programming课程项目设计说明 MultiView Project 功能说明 MultiView Project系统实现对成绩的统计,并通过直方图和饼图来显示统计的结果,成绩数据可以从文件中载入,也可以进行增加、删除、清空等操作,原始数据显示在面板左边;当成绩数据发生变化包括增加、删除和清空时,柱状图、饼状图两种图形以及左边分数数据面板分别调整图形中色值区域和左边数值。我们通过下面的Project Demo来说明项目的主要功能。1.主界面: 界面分为上下两个面板,上面面板是包括四个命令按钮的工具条,分别为载入、增加、删除和清空四个功能。成绩文件里面的数值示在左下方界面,右下面
2、面板显示相应的直方图和饼状图分布。2. 主要功能概述1) 点击“Load”按钮,加载成绩文件里面的数值并显示在左下方界面,同时显示相应的直方图和饼状图;2) 点击“Add”按钮,将增加新成绩到成绩文件中,修改左下方成绩和右边直方图和饼状图分布;3) 点击“Delete”按钮,将删除成绩文件对应成绩,修改左下方成绩和右边直方图和饼状图分布;4) 点击“Clear”按钮,清空面板左边的所有成绩,和右边的直方图和饼状图信息;3.详细说明各模块功能流程 3.1载入功能 主要是用来加载数据文件,数据文件为文本文件,每行一个数据。 点击【load】按钮,选择路径找到data.txt 文件,点击【打开】,用
3、户可以通过加载数据列表对存放在纯文本文件中的数据进行一次性导入。显示如下: 面板的左边是加载进去的数据内容,面板右边是本项目实现对成绩进行统计,并以柱状图和饼状图进行比例展示的功能。 程序将自动计算出0-59,60-69,70-79,80-89,90-100各分段的数据分布。按照相应比例,分别画出对应柱状图和饼状图中的深蓝、浅蓝、绿色、粉红色和黄色区域的面积大小。3.2增加数据 按钮是对数据进行增添数据操作,当点击【add】后,系统将弹出“请输入整数值”对话框,用户可以输入一个或者多个数据,如果输入多个数据,数据之间用逗号分隔。 当输入一个“89”数值之后,黄色在柱状图和饼状图的面积分布增加,
4、其他颜色可能发生相应变化。 加入“89”后 加入“89”前3.3删除数据 按钮是对文件中数值进行删除操作,当点击【delete】弹出对话框如下 在这个对话框里面输入相应的数值,比如“46”如果这个数值不在里面,左边的数值不会发生人任何改变。右边的柱状图和条形码保持不变。当输入包含在数值文件中的“78”时 图形相应就发生如下变化,左边数值中78已被删除,右边绿色区域代表70-79区间的范围也减小,其他颜色也可能发生相应变化如下图所示:3.4清空数据 点击按钮,面板的所有数据将会被全部清空。显示为初始状态no data。 设计说明描述 本项目实现对成绩进行统计并以柱状图和饼状图进行比例展示的功能,
5、并在程序中使用了观察者模式,当项目中数据发生变化时,将通知所有观察者数据已发生变化并作出相应的调整。用户可以通过加载数据列表对存放在纯文本文件中的数据进行一次性导入,程序将自动计算出0-59,60-69,70-79,80-89,90-100各分段的人数分布。当成绩数据发生变化时,变化包括增加删除和清空,界面各图,包括柱状图饼状图两种图形控件以及分数数据面板分别调整图形中色值区域与列表数据。1.1 观察者模式整体结构说明 具体实现类图如下所示:观察者模式可类比为现实世界的观察行为,如被观察者A的某个数据发生改变时,观察者做出某种响应。该例中,成绩数据作为被观察者,成绩数据发生改变时,观察者们(界
6、面元素)分别做出相应的变化。程序中类与方法描述如下: Java自带观察者模式,数据主体继承自Obversable,所有观察者需要实现自Observer.如DataModel类中:public class DataModel extends Observable public void load( String fileName ) throws FileNotFoundExceptionpublic void append(int score) public void clear() public void delete(int score) 上述四个方法分别代表数据加载,数据增加,数据清空,
7、数据删除。他们在实现时由于主体数据改变需要调用父类中实现的notifyObservers方法来通知所有观察者进行数据刷新操作。BarJPanel与PieChart分别代表柱状图与饼状图。 如下两段代码所示,实现Ovserver方法中代码后,主体数据发生改变时会调用到两类中的update方法,便可对界面进行重绘(调用父类repaint方法)。public class BarJPanel extends JPanel implements ObserverOverridepublic void update(Observable arg0, Object arg1) / TODO Auto-gen
8、erated method stubif ( arg1 instanceof int)numbers = (int) arg1;this.repaint();public class PieChart extends JPanel implements Observer Overridepublic void update(Observable o, Object arg) / TODO Auto-generated method stubif ( arg instanceof int)numbers = (int) arg;this.repaint();成绩列表数据面板与上两种类似。而程序的
9、主界面MainFrame类则类似于控制器。在程序初始化阶段,执行下述代码:/* * 构造器 */public MainFrame() super();initialize();dataModel.addObserver(barChart);dataModel.addObserver(pieChart);dataModel.addObserver(textJPanel);当程序启动时,会调用该构造器,便会将饼形图面板,柱行图面板以及分数数据面板注册为DataModel数据的观察者。这样在DataModel发生改变时(notifyObservers)时,三个面板界面都会得到刷新。1.2 DataM
10、odel数据类设计描述 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 = sc
11、ore / 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 FileNotFoundExceptionSca
12、nner 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
13、,高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; 而后计算
14、出各个分数段与个数最多的分数段的比例,得到的结果存放到percenti中,方便后面画柱状图时决定他的高度。for (int i=0; ipercent.length; i+) percenti = (double) numbersi) / max; 接着计算每个柱的宽度,与个数最多的分数段的高度yHeight。后面将上面计算的percenti各个分数段与yHeight相乘便可得到每个柱状图的高度。 最后遍历percent将各个柱状图的起始点与宽高传入fillRect方法便可绘制一个长方形柱状图。注意每个柱状图画完后,需要对柱状图的起始点左边进行位移操作int xWidth = (this.ge
15、tWidth()-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);/填充长方形,长方形的左上
16、角起点位y-heightx += 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
17、 * 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(
18、);/更新文本1.6 MainFrame 该类为程序主窗体,主要负责控制各个按钮的事件。下面几个方法中分别得到四个按钮并各四个按钮添加事件private JButton getJButtonDelete() private JButton getJButtonClear() private JButton getJButtonAdd() private JButton getJButtonLoad() 2.界面GUI设计描述JPanel为Swing中最基础的面板控件,我们可以自定义控件继承自JPanel类后,复写paintComponent方法,便可在程序运行时制定我们需要的效果。 MainF
19、rame类为程序主窗体,主要负责控制各个按钮的事件。程序运行时,先调用initialize方法,生成一个内容面板,即getJContentPane()获取到的控件。 主窗体采用BorderLayout方式布局:jContentPane.setLayout(new BorderLayout();BorderLayout将窗体分成东南西北中五个位置,如代码所示,jContentPane.add(getJPanel(), BorderLayout.CENTER);jContentPane.add(getJToolBar(), BorderLayout.NORTH);jContentPane.add(
20、textJPanel, BorderLayout.WEST);分别将统计图栏,工具栏,分数列表栏和放在中间位置,北位置和西位置。而后程序调用下面几个方法中分别得到四个按钮并给四个按钮添加事件private JButton getJButtonDelete() private JButton getJButtonClear() private JButton getJButtonAdd() private JButton getJButtonLoad() loadDataFile方法负责生成一个文件选择对话框提供给用户选择数据文件。private void loadDataFile() /Cre
21、ate a file chooserfinal JFileChooser fc = new JFileChooser();try fc.setCurrentDirectory(new File(.);/In response to a button click:int returnVal = fc.showOpenDialog(this);if ( returnVal = JFileChooser.APPROVE_OPTION) dataModel.load( fc.getSelectedFile(); catch (Exception ex) ex.printStackTrace(); 项目
22、要求你的项目必须进行功能补充: 这里只是一个基础的观察者模式,还有未完善部分例如:柱状图横纵坐标标识,各个颜色分别代表哪一个数值域。饼状图各个模块数据比例的显示等等,功能越完善,项目越优秀。项目评分细则你的工程将会按照以下准则来评分: 基本功能准确 - 70%o 项目实现准确地实现所有要求的功能:导入,增、删以及数据段比例统计的柱状图和饼状图.o 工程无报错.o 项目对于适当的错误数据具有冗余性,比如-67 ,108.o 项目运行有效性. 代码风格 - 10%o 规范,漂亮书写.o 可读性强,容易理解.o 正确地对关键函数进行缩进.o 函数中不同逻辑块适当的使用空行进行间隔. 项目设计步骤描述报告 - 20% 报告中不允许出现重复或者剽窃现象,如果被检测出来,项目为0分。项目提交提交内容如下: 所有的源文件 jar 文件 项目报告文档项目截至日期:考试后一周内提交。