




免费预览已结束,剩余14页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
华南农业大学计算机科学与工程系 面向对象程序设计 课程设计评分表题 目数字相片管理程序专业班级10级软件工程R4班提交日期2012.10.31小组成员学 号姓 名工作量% 成绩(指导老师填写)组 长郑兆龙20103100043040%组 员陈思宇20103100040230%组 员曾斌20103100042630%小组评分表评分项目分数1实现情况(15):完成课程设计要求的情况2系统分析(10):对系统的理解及分析的深入程度。3系统设计(20):总体设计、具体设计、数据结构设计等。4程序设计(30):面向对象程序设计方法与编程工具掌握水平。5界面设计(15):界面美观程度、操作方式友好程度等。6论文撰写(10):论文撰写的规范性、合理性等等。小组总成绩:教师签名宋鸿陟日 期1.系统分析1.1问题描述随着数码相机的普及,越来越多的人拥有大量的数字像片,不过,问题也随之而来,大家知道如果数字相片的数量很庞大的话,人们对照片的管理就会很不方便,所以为了帮助人们解决这个困扰,经过调查分析后我们小组决定开发一个能够对数字像片进行管理的应用程序,以方便人们对他们的数字相片进行管理。1.2系统功能分析经过系统地调查分析,我们小组最终开发出的数字相片管理程序应该具备以下功能:(1) 能处理目前主流的图片格式。比如:.JPG、.JPEG、.GIF、.PNG文件等;(2) 显示计算机中文件的树状结构;(3) 以缩略图显示的方式支持用户对本地图片进行预览;(4) 查看并播放用户选定的文件夹内的图片文件;(5) 支持用户对选定图片进行常规管理。比如:图片删除、图片复制、图片改名等。1.3开发平台及工具介绍 我们小组采用的开发工具是Eclipse,Eclipse是著名的跨平台的自由集成开发环境(IDE),主要用于java开发,Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。另外,由于swing设计的界面不好看,我们采用的是SWT来实现界面设计,主要的jar包有swt.jar。SWT是一个IBM开发的跨平台GUI开发工具包。在SWT之前,Sun已经提供了一个跨平台GUI开发工具包AWT (Abstract Windowing Toolkit)。虽然AWT框架也使用的是原生窗口部件(native widgets),但是它一直未能突破LCD问题。LCD问题导致了一些主要平台特征的遗失。为解决这个问题,Sun又创建了一个新的框架。这个框架不再使用原生窗口部件,而是使用仿真窗口部件(emulated widgets)。这个方法虽然解决了LCD问题,并且提供了丰富的窗口部件集,但是它也带来了新的问题。例如,Swing应用程序的界面外观不再和原生应用程序的外观相似。 虽然在JVM中这些Swing应用程序已经得到了最大程度的性能改善,但是它们还是存在着其原生对应物所不具有的性能问题。并且,Swing应用程序消耗太多的内存,这样Swing不适于一些小设备,如PDA和移动电话等。IBM进行了尝试以彻底解决AWT和Swing框架带来的上述问题。最终,IBM创建了一个新的GUI库,这就是SWT。SWT框架通过JNI来访问原生窗口部件。如果在宿主(host)平台上无法找到一个窗口部件,SWT就会自动地模拟它。另外,由于涉及到图片的处理,我们使用了thumbnailator-0.4.2-all.jar来对图片进行放大缩小等操作。2、系统设计2.1系统总体结构设计从系统功能分析中,我们可以抽象出系统要实现的模块共有3个。分别是系统左边的文件树,系统的缩略图面板以及系统的图片浏览面板。这三大模块中有各自独立的部分,但彼此之间又是相互联系着的。例如:在左边选取某一文件夹后,若该文件夹中有图片,则显示在缩略图面板上;选取另一个文件夹后要对缩略图面板进行刷新,并把新的图片绘制上去;在缩略图面板上双击某图片后可以进行该图片的浏览,可以进行放大缩小等功能;关闭图片浏览面板后又可回到当前的缩略图浏览面板。这是这三大模块之间的一个联系。2.2系统各个类及类之间关系设计在文件树模块中,主要的类有TreeView,EditPopup,TreeView类的功能是把桌面,我的文档,我的图片,各个磁盘显示在左边的系统文件树上,当选择其中的某一个选项时,若该选项下还有文件则会在生成一个文件树,由于是采用监听器的方式去实现文件树,而不是一次性全部遍历加载,所以系统启动时比较快速;而且文件夹是单个地选择,这样的话展开该文件就不会耗费很长的时间,用户体验好。EditPopup类的功能则是右击弹出菜单,菜单中包含于图片重命名,删除,复制,粘贴等操作。其具体实现则是通过FileDeal类,该类的功能是提供批量的重命名,复制粘贴等操作以及单个文件的重命名,复制粘贴等操作。在缩略图面板模块中,主要的类有ThumPanel,JEditPopup,Thumb,ExtensionFileFilter。ThumPanel类的功能是实现图片的显示以及刷新问题;JEditPopup则为右击菜单;Thumb类实现图片的缩放,方便以缩略图的形式显示在缩略图面板上;ExtensionFileFilter类则是对非图片文件的一个过滤,以便于把图片文件传到Thumb中进行处理。而在图片浏览面板中,主要的类则是ViceFrame,该类把在缩略图面板中双击选中的照片放到面板上进行浏览,并可进行相应的操作。文件树模块以及缩略图模块之间通过Tree对象来进行数据交互,而缩略图模块以及浏览模块则是通过File对象来进行数据的联系。2.3数据存储的设计(文件等)由于电子像片管理程序的主要功能是浏览图片,其数据来源则是各种不同格式的图片,而对于数据的输出格式则很少有要求。因此,我们这个项目主要用到数据存储的地方则是在复制粘贴的时候,复制时用FileInputStream读取图片流,存储时则根据其格式用FileOutputStream输出到相应格式文件中。2.4 界面设计主窗口中主要把整一个shell划分成了3块,上面一块显示菜单栏,下面一块再划分成左右两部分,左边包括用于显示文件树,右边用于显示缩略图;而副窗口,即图片浏览窗口,则分成上下两个Jpanel,上面的Jpanel用于显示图片,下面的Jpanel用于对当前图片的操作。3.系统实现(主要模块的流程图及代码段片段)文件树代码片段: public void createTree() init(); createMyComputer(); createDeskTop(); createDocument(); createPicture(); createComputer(); addListener(); tree.select(picture); public void init() tree=new Tree(parent, SWT.BORDER); /设置背景颜色 tree.setBackground(new Color(parent.getDisplay(), new RGB(234, 240, 243); /将鼠标形状变为手型 tree.setCursor(new Cursor(parent.getDisplay(), SWT.CURSOR_HAND); public void createMyComputer() mycomputer=new TreeItem(tree, SWT.NONE); mycomputer.setFont(new Font(parent.getDisplay(), new FontData(我的电脑, 13, SWT.COLOR_DARK_YELLOW); mycomputer.setImage(new Image(parent.getDisplay(), images/mycomputer.png); mycomputer.setText(我的电脑); .public void addListener() tree.addListener(SWT.Expand, new Listener() public void handleEvent(Event event) final TreeItem root = (TreeItem) event.item; TreeItem items = root.getItems(); for (int i = 0; i items.length; i+) if (itemsi.getData() != null) return; itemsi.dispose(); File file = (File) root.getData(); /返回File对象(文件夹与文件)的数组 File files = file.listFiles(); if (files = null) return; for (int i = 0; i files.length; i+) /判断当前路径是否为隐藏文件与文件夹 if (filesi.isHidden() = false)& (filesi.isFile() = false) TreeItem item = new TreeItem(root, 0); item.setText(filesi.getName(); /叶子节点对应的数值为相应文件夹的File对象 item.setData(filesi); /创建文件夹图 Image foldericon= new Image(parent.getDisplay(),images/file.png); item.setImage(foldericon); /当前为文件目录而不是文件的时候,添加新项目,以便只是显示文件夹(包括空文件夹),而不显示文件夹下的文件 if (filesi.isDirectory() new TreeItem(item, 0); ); 缩略图代码片段public ThumPanel(Tree tree,Composite rightCom,Shell shell,Display display)this.display=display;this.shell=shell;this.tree=tree;this.rightCom=rightCom;jEditPopup=new JEditPopup(tree); frame=SWT_AWT.new_Frame(rightCom); /创建双缓存Jpanel jPanel=new JPanel(true); /创建缩略图工具类 thumb=new Thumb(); jPanel.setLayout(new GridLayout(0,6,10,10); jPanel.setBackground(new java.awt.Color(255, 255, 255); /设置缩略图面板的右击菜单 jPanel.setComponentPopupMenu(jEditPopup.getjPopupMenu(); jScrollPane=new JScrollPane(); frame.setSize(751, 470); /设置左边树的右击菜单 tree.setMenu(new EditPopup(this.shell, this.display,this.tree).createEditPopup();./采用多线程绘制缩略图到面板final class ThumThread extends ThreadFile files;int start;int end;public ThumThread(File files,int start,int end)this.files=files;this.start=start;this.end=end;Overridepublic void run() for (int i=start; i =icons.size()-1)return;else left.setEnabled(true);icons.remove(i);icons.add(i,thumb.getPreIcon(fileAll.listFiles(fileFilter)i);label.setIcon(icons.get(+i);int WIDTH=icons.get(i).getIconWidth();int HEIGHT=icons.get(i).getIconHeight();label.setPreferredSize(new Dimension(WIDTH, HEIGHT);if(i=icons.size()-1)right.setEnabled(false);panelC.validate();Overridepublic void actionPerformed(ActionEvent e) if(i=icons.size()-1)play.setEnabled(false);pause.setEnabled(false);timer.stop();return;else left.setEnabled(true);icons.remove(i);icons.add(i,thumb.getPreIcon(fileAll.listFiles(fileFilter)i);label.setIcon(icons.get(+i);int WIDTH=icons.get(i).getIconWidth();int HEIGHT=icons.get(i).getIconHeight();label.setPreferredSize(new Dimension(WIDTH, HEIGHT);if(i=icons.size()-1)right.setEnabled(false);panelC.validate();/变大class enLarge extends MouseAdapterOverridepublic void mouseClicked(MouseEvent e) BufferedImage image=(BufferedImage)icons.get(i).getImage();icons.remove(i);icons.add(i,thumb.getLargeIcon(image);int WIDTH=icons.get(i).getIconWidth();int HEIGHT=icons.get(i).getIconHeight();label.setPreferredSize(new Dimension(WIDTH, HEIGHT);label.setIcon(icons.get(i);panelC.validate();/播放图片 class play extends MouseAdapterOverridepublic void mouseClicked(MouseEvent e) play.setEnabled(false);pause.setEnabled(true);timer.start(); /删除图片 class trash extends MouseAdapter Overridepublic void mouseClicked(MouseEvent e) int k=JOptionPane.showConfirmDialog(frame, 是否要删除?);/k=0表示删除,等于1表示否,等于2表示取消当前操作.if(k=0)File f=fileAll.listFiles(fileFilter)i;f.delete();icons.remove(i);if(icons.isEmpty()label.setIcon(null);trash.setEnabled(false);enLarge.setEnabled(false);reduce.setEnabled(false);play.setEnabled(false);right.setEnabled(false);left.setEnabled(false);pause.setEnabled(false);frame.dispose();return;label.setIcon(icons.get(i);int WIDTH=icons.get(i).getIconWidth();int HEIGHT=icons.get(i).getIconHeight();label.setPreferredSize(new Dimension(WIDTH, HEIGHT);if(i=icons.size()-1)right.setEnabled(false);panelC.validate();else return; 图片复制、粘贴、删除、重命名处理代码片段/单个文件复制public FileInputStream fileCopy() try fis=new FileInputStream(srcFile); catch (FileNotFoundException e) e.printStackTrace();System.out.println(已复制+srcFile.getName()+到剪贴板);return fis;/复制整个目录private void directoryCopy() listfiles();if(files=null)return;fileBUff=new ArrayList();for(File f:files)try FileInputStream fis = new FileInputStream(f);fileBUff.add(i+,fis); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/单个文件粘贴public void filePaste(FileInputStream fis,String destPath) FileOutputStream fos=null;this.fis=fis;this.destPath=destPath;try fos=new FileOutputStream(destPath+srcFile.getName();System.out.println(destPath+srcFile.getName();byte buff=new byte32;int hasRead=0;while(hasRead=fis.read(buff)0)fos.write(buff,0,hasRead); catch (Exception e) e.printStackTrace();finallyif(fos!=null)try fos.close(); catch (IOException e) e.printStackTrace();if(fis!=null)try fis.close(); catch (IOException e) e.printStackTrace();/粘贴整个目录private void directoryPaste() for(int j=0;j0)fos.write(buff,0,hasRead); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();finallyif(fos!=null)try fos.close(); catch (IOException e) e.printStackTrace();fileBUff.removeAll(fileBUff);/文件命名private void fileRename(String newName) String string=srcFile.getPath();String ss=string.substring(string.lastIndexOf(.),string.length();File f=new File(srcFile.getParent()+newName+ss);System.out.println(srcFile.getParent()+newName+ss);srcFile.renameTo(f);/目录内文件全部命名private void directoryRename(String newName) listfiles();for(int i=0;ifiles.length;i+)String string=filesi.getName();String ss=string.substring(string.lastIndexOf(.),string.length();File f=new File(srcFile+newNamei+ss);System.out.println(f.getPath();filesi.renameTo(f);/单个文件删除private void fileDel() srcFile.delete();System.out.println(文件+srcFile.getName()+已删除);/删除目录内所有图片文件private void directoryDel() listfiles();for(File f:files)f.delete();System.out.println(已批量删除+files0.getParent()+里的文件);4、系统测试4.1模块测试:测试各模块的测试 说明:测试步骤为 设计测试用例:包括输入数据,预期结果。实际运行程序得到:运行结果分析预期结果与运行结果的异同得到测试结论。(1) 文件树模块测试由于文件树模块的输入由系统自动完成,故无需输入,预期效果为能显示 出系统的文件树在左边。运行结果如预期所料,能产生一颗系统文件树,但必须得点击其左边的小 三角形才能展开文件树,而不能单击文字展开。文件树模块的实现主要是靠监听用户的单击事件,而swt中默认就是单击 小三角形性才能展开,对比eclipse的包结构树也可发现此特点。(2) 缩略图模块测试缩略图模块的输入数据主要是各种不同格式的图片,预期效果为在缩略图 面板能显示出图片以及在图片下方能显示该图片的名称,单击该图片时会 选中该图片以及文字,再次单击可重命名,双击可在浏览面板浏览该图片 的大图。运行结果确实能显示图片以及在图片下方能显示图片的名称,但选中该图 片时无法同时高亮该图片,仅文字可以变色让用户知道已选中该图片。再 次单击时也无法做到重命名,只能通过右键重命名。双击可以打开图片浏 览面板。我们得出的结论是由于图片使用JLabel来盛装,而JLabel是无法给用户 一种选中的感觉,因而单击后可重命名这些功能也就无法在这里实现,只 能通过右键菜单来实现。(3) 图片浏览模块数据的输入来源于在缩略图中所双击的图片,预期效果为能显示该图片的 大图,并能把该图片所在的目录的其它图片也能通过上一张、下一张等浏 览。运行结果能显示该图片,也能放大缩小,播放,暂停,下一张,上一张, 删除。但有一个问题就是图片缩小后再放大会失真。我们是采用thumbnailator.jar包中的类来对图片进行放大缩小处理,而 其中它有一个方法是是否不压缩图片的分辨率,即按原来的分辨率不失真 输出,我们采用了不失真放大和缩小。但缩小时再放大却失真了,问题可 能就出在了这里。4、2系统测试:系统功能的完整测试 说明:测试步骤为 设计测试用例:包括输入数据,预期结果。实际运行程序得到:运行结果分析预期结果与运行结果的异同得到测试结论。 系统初始化后,可通过点击左边的文件树选择一个文件夹,该文件夹中的图片作为缩略图面板中的图片来源,然后缩略图面板根据该文件夹把所有的图片绘制到面板上。在文件树上右击可选择复制、粘贴、重命名、删除该文件夹中的图片等功能。在文件树中选择另一个文件夹后,不管其是否有图片,都应刷新缩略图面板。若有图片,则应重新绘制图片到面板上。从面板上选择一张图片右击可选择重命名、复制、粘贴、删除该图片等功能。双击后可打开图片浏览面板,把该文件所在目录的所有图片也读到内存中,以便可以单击上一张、下一张浏览。而在图片浏览面板中还必须实现放大、缩小,播放、暂停、删除当前图片等功能。 运行结果与上述预期效果大致相同,但有一些地方不尽如人意,例如在主面板中复制、删除、或重命名后不能动态刷新,必须要重新点击方可刷新缩略图面板。 系统功能的实现与每个模块的具体分工是离不开的,而每个模块中,各个类的设计也至关重要。在我们的这个程序中,每个类都有其负责的功能。而多个类封装在一个模块中并提供对外的接口,降低了各个模块之间的耦合性,这体现了面向对象的思想。至于与预期效果有些不同,我们所认为的原因是并没有一条线程去监控缩略图面板中的图片是否发生了改变,若是,则应通知相应的线程去重新加载图片。5.系统运行界面主界面如下:图片重命名时显示如下,由于采用多线程,故显示没有序(文件名为dragon,起始编号为1,编号位数为4)图片浏览界面如下:图片放大:图片缩小:播放当前文件夹图片:6、总结组员陈思宇:这个课程设计,我们用到了比较流行的设计模式MVC设计模式。通过了这个课程设计,我认识了很多设计模式。说到设计模式,设计模式主要分为创建型模式:如何创建对象和何时创建对象;结构型模式:对象该如何组织以及采用什么样的结构更合理;行为型模式,规定各个对象应该具备怎样的职责以及对象间的通信模式。其中具体的还有简单工厂模式:由一个工厂类传人的参数决定创建出哪一种产品类的实例,更为之好懂的是工厂方法模式,它不在负责所有产品的创建,仅负责给出具体工厂子类必须实现的接口。而我们这次采用的MVC模式确实是一个设计模式,但更是一个架构模式,用于描述软件系统基本结构组织或纲要,提供一些事先定义好的子系统,指定它们的职责,并给出它们组织在一起的法则和指南。其实MVC指的就是Model,View,Control,这种思想将应用逻辑,处理过程和显示逻辑分成不同的组件来进行实现。这种思想最初是用在java web实现,Model层是用于实现系统的业务逻辑,通常用javaBean或EJB来实现;View层用于与用户的交互,通常用JSP来实现;Control层则是Model层与View层之间的桥梁,它可以分派用户的请求并选择适当的视图用于显示,同时它可以解释用户的输入并将他们映射成模型层可执行的操作。而在我们这次的课程设计里来说,Model层主要就是业务逻辑,各种操作的实现方法和算法;View就是图片管理器的界面,用于显示系统的文件夹和图片,以及观看图片的界面;而Control层就是对用户想进行的操作从View层调用Model层的方法,再返回给View层进行显示。而我主要负责Control层的代码编写,以及View层的界面美化。通过这次的课程设计我主要懂得了界面,业务逻辑和响应的三部分可以分开来编写,例如用户需要打开一个图片,他只需要点击View层菜单栏中“打开”按钮,然后调用我在Control层的代码,即可调用Model层的打开图片方法。而在图片显示方面,我们原本是打算使用重写JPanel的Paint方法,但是后来发现会有一种更好的方法,可以将文件转为二进制的ImageIcon,然后通过在网上找的jar包中类的方法可以对图片进行放大和缩写的操作会更为方便,然后使用JLabel的setIcon方法将他显示在JFrame面板上,这样就比之前的方法好多了。另外我们在界面上并没有完全采用Swing来操作,而是使用SWT,这样它可以利用系统的资源进行调配,这样界面就会和电脑中原有的系统更加匹配和和谐,有更好的用户体验。同时我们这个系统还有一些不足,在界面上我们大多才用的是网上的素材,而系统书那边的图标我们采用的是美图看看的图标,这样显得没有什么创新性,界面也不怎么美观,需要进行改进。还有尽管采用了多线程来处理图片,图片在多起来的时候还是有些缓慢,而且图片出来得比较没有顺序,这个地方也是需要改进的。总的来说,我这次并没用对团队做多大的贡献,但是也跟组长学习到了不少知识,希望我们在下一次的项目也能合作,也希望在下一个项目我能在团队中真正帮到手,有更大的进步。组员曾斌:忙活了几个星期,终于搞定了面向对象程序设计的课程设计,现在自己可以说是能松一口气了。这次的面向对象程序设计的课程设计,我们小组开发的是一个电子相片管理系统,可以说这个电子相片管理系统开发起来一点也不简单,开发过程可以说是充满坎坷。在开发这个电子相片管理系统过程中,我承担的开发任务是设计开发这个电子相片管理系统的全部界面实现。当初接到分配的这个开发任务时,我信心满满的要在一个星期之内搞定,可是谁知我用的时间远远超过了我的预期时间。出现这个原因就是因为开始时我对界面开发的认识很肤浅,没有认真构思就仓促地进行界面开发,最终导致开发的时间远远超出我的预期完成时间。这个电子相片管理系统的界面我是用swt来进行开发的,当初选用swt来开发这个电子相片管理系统地界面是有原因的,java类库虽然也有与GUI设计有关的类,可是开发出来的效果不尽人意,不能展现出各平台的GUI特性,而swt就不同,用swt开发出来的界面很好地体现出了各平台的GUI特性,而且可以说用户根本看不出swt开发出来的界面是使用java开发出来的界面。在这次做面向对象程序设计的课程设计的过程中,我学到了很多东西。其中我最深有体会的感触之一就是:软件开发是一种很艰辛的过程,不过也是一种让人很
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国桐果项目创业计划书
- 中国红干椒项目创业计划书
- 中国家电电商项目创业计划书
- 中国AR(增强现实技术)项目创业计划书
- 中国绒毛项目创业计划书
- 中国可可项目创业计划书
- 中国紧急洗眼器项目创业计划书
- 中国电子图书项目创业计划书
- 中国多功能超声监护仪项目创业计划书
- 中国5G手机项目创业计划书
- (2025)纪检监察业务知识考试题及含答案
- 网络安全技术实操技能考核试题及答案
- 国家保安员模拟试题及答案(附解析)
- 2025届广东省佛山市南海中学七下数学期末学业水平测试试题含解析
- DB31/T 1402-2023养老机构认知障碍照护单元设置和服务要求
- 湖南省长沙市师大附中教育集团2025年数学七下期末综合测试试题含解析
- 血管通路介入治疗
- 高速公路养护安全培训课件
- 软件知识产权授权管理框架与合规性研究
- 2025年山东省潍坊市中考二模地理试题及答案
- 全新入股在股东名下协议二零二五年
评论
0/150
提交评论