java课程设计 图片查看器_第1页
java课程设计 图片查看器_第2页
java课程设计 图片查看器_第3页
java课程设计 图片查看器_第4页
java课程设计 图片查看器_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE27成绩课程名称面向对象程序设计课程设计专班级、设计题目指导教师设计起止时间:2013年1月7日至2013年1月18日目录1、课程设计概述 42、系统功能描述 43、系统需求分析与设计 43.1系统需求分析 43.2系统设计 43.2.1系统总体设计 43.2.2程序详细设计 54、系统测试和使用说明 84.1系统测试 84.2系统使用说明 105、课程设计总结 105.1遇到的问题和解决方法 105.2心得体会 10参考文献 10附录 111、课程设计概述鉴于目前当今各种繁杂的图片查看器,我们组根据自身的java知识水平,合力开发了一款相对简单的图片查看器软件。在深入理解java语言的语法规则及其优势的同时,掌握类与方法的构造方法,掌握基于java的各种操作的实现方法,训练对基础知识和基本方法的综合运用能力,增强对算法的理解能力,提高软件设计能力。在实践中培养独立分析问题和共同解决问题的作风和能力。2、系统功能描述本次设计的图片查看器实现了在用户选定的文件目录下循环浏览指定后缀的图片文件,并且可以对选择的图片进行放大,缩小,左旋,右旋,另存,彻底删除等操作。3、系统需求分析与设计3.1系统需求分析数字产品的更新日新月异,网络通信技术、图像处理技术以及多媒体技术的发展,使我们的生活变得丰富多彩,让我们的生活变得更便捷,图片的保存和查看已经被越来越多的人所重视,并由此得到了长足的发展。本图片查看器以其简洁明了易操作的特点实现图片查看的基本功能,从而也就满足了用户的基本要求。3.2系统设计3.2.1系统总体设计(1)系统功能分析本系统要用到以下的Java编程技术实现的功能:图像显示功能:用户需要显示图片,这将由图像显示功能来完成。显示图片的时候,用到了双缓冲技术来消除闪烁问题。(2)类图系统中用到了一些基本类、实现了一些接口。系统所用到的类如图1所示:PicViewerPicViewerActionListenerJpanelJLabelJButtonImageBufferedImageGraphics2DStringJfilechooseAppletJava.awt.*Javax.swing.*Java.io.*Java.applet.*extendsimplementimport图1系统类图3.2.2程序详细设计(1)程序中引用的类①JPanel类程序中定义了三个Jpanel类分别是:pathBar,picContainer,ctrBar。用于图片查看器的整体布局。其中pathBar为顶部路径栏,picContainer为图片显示区域,ctrBar为底部控制栏。②JLabel类程序中定义了类名为pathInfo的JLabel类,用于实现顶部路径栏,底部控制栏按钮的文字显示。③JButton类程序中定义了多个JButton类:openbtn,prebtn,nextbtn,zoominbtn,zoomoutbtn,oripicbtn,angleleftbtn,anglerightbtn,exitbtn,deletebtn,sav;为查看器的按钮。④Image类程序中定义了名为pic的Image类用于对被查看的图片的操作。⑤BufferedImage类此类为用于显示的缓冲区图像。在对图像进行操作前,都先将图片读进预设的缓冲区,然后再显示在用户前端,这样虽然速度慢了点,但很好的消除了图片闪烁效果。⑥Graphics2D类此类与上面的BufferedImage类共同作用,通过运用双缓冲技术很好的消除屏闪问题。⑦String类程序中运用了三个不同的String类,从而实现了需要查看的图片的路径的操作,并且在启动图片查看器时,图片的路径能够在路径栏显示出来。同时还设置了String数组用于存储用户选定的目录下所有指定格式的图片,这样可以实现循环浏览图片等操作。(2)程序的构造方法及其实现因为图片查看器可以实现对图片不同的操作,程序中构造了十多个方法以达到其目的。各构造方法相互联系共同完成图片查看器的各项功能。各个方法描述如下:①publicvoidinit()本方法实现了对图片查看器的界面的整体布局及按钮的初始化。对页面的总体布局采用了以下主要代码进行实现:setLayout(newBorderLayout());add(pathBar,BorderLayout.NORTH);add(picContainer,BorderLayout.CENTER);add(ctrBar,BorderLayout.SOUTH);resize(640,400);设置顶部路径栏,及其文字显示;代码如pathBar=newJPanel();pathBar.setLayout(newBorderLayout());pathInfo.setText("图片查看器");pathBar.add(pathInfo);同时对图片显示区域,底部的控制栏的设置也运用了相似的代码进行实现,在此就不再重复。各按钮除了“打开”一按钮外,其他的各按钮均设置为false。这是因为只有“打开”图片后才能进行以下的像循环浏览,旋转,删除等操作。具体方法的实现见附件。②publicvoidactionPerformed(ActionEvent)在本方法中主要实现了用户对底部控制栏各按钮的点击后,图片查看器进行的相对应的操作反应。方法中一开始用JButtonclick=(JButton)e.getSource();获取按键源,然后根据click与程序设定的已知的类进行比较决定进行相应的反应。if(click==openbtn);if(click==prebtn&&pic!=null);等一系列进行判断后,进行或是打开文件open()方法的调用;或是pre()方法的调用;其他各操作也大同小异,在此就不再赘述。方法的详细代码见附件。③publicvoidopen()该方法实现了对用户选定的文件路径下的后缀为.jpg的图片文件的打开操作。同时能够对该路径下的一切符合条件的文件进行跟踪处理。方法中的核心在于一个过滤操作:FileNameExtensionFilterfilter=newFileNameExtensionFilter("*.JPG","jpg");这样就能实现.jpg文件的浏览了。在选定了图片后,相应的按钮值应该被赋值为ture,以便进行其他的操作。若没有选定图片则显示“没有选择图片”。④publicvoidsave()throwsIOException该方法是为了满足用户希望对图片进行另外存储的操作,通过用户自己的选择重新选定图片的存储路径。详细实现见附件中代码。⑤publicvoidpre()及publicvoidnext()Pre与next方法实现了对当前图片的上一张下一张的浏览。因为在第一次打开文件时就将该路径下所有符合要求的图片存储在String[]pics中。通过if(i==0){i=pics.length-1;}else{i--;}其中i为当前的图片位置数。通过dir=path+"\\"+pics[i];获得文件的路径,然后调用loadImage(dir);此方法将在后面介绍;与上面的方法相对应的是此方法实现了对当前图片下一张的浏览,实现原理与上相同,if(i==pics.length-1){i=0;}else{i++;}通过调用loadImage(dir);一方法实现。⑥publicvoidpicTrans()如果bufImage为空则直接返回,之后进行过滤图像操作,2D仿射变换,设置仿射变换的比例因子transform.setToScale(scaleX,scaleY);创建仿射变换操作对象,过滤图像,将目标图像存在filteredBufImage中,然后显示。⑦publicvoidzoomin()此方法实现了对当前的图片进行按设置比例缩小操作。在进行缩小操作前,先对图片的大小进行判断,看是否已经缩小到最小,若最小则显示提示信息“已经缩至最小!”;否则进行缩小操作。在此过程中调用了picTrans()方法,以及repaint();重绘组件的方法。⑧publicvoidoripic()及publicvoiddelete()方法实现了将放大或缩小后的图片大小还原的操作。同时也调用了picTrans()方法,以及repaint();重绘组件的方法。具体的picTrans()方法将在下面详细描述。此方法具体实现见附件;publicvoiddelete()方法将图片彻底删除,删除后图片彻底被粉碎,回收站里面都不能找到。因此要慎用此按钮。⑨publicvoidangleleft()及publicvoidangleright()方法每次对图片进行45°的向左向右的旋转操作。radius+=-Math.PI/2;用以控制,而这些操作后,每次都应oripicbtn.setEnabled(true),也就是要将还原按钮赋值为真。⑩publicvoidloadImage(StringfileName)及publicvoidexit()前一个方法通过增加图像到加载器中,创建原始缓冲区图像,创建bufImage的图形环境:bufImageG=bufImage.createGraphics();传输源图像数据到缓冲区图像中一些列的操作,对图片进行了加载操作;publicvoidexit()方法是退出查看器的方法。4、系统测试和使用说明4.1系统测试使用eclipse运行程序时,会出现applet小程序的界面。并显示程序已启动。显示如图2:图2程序开始时的界面单击“打开”按钮后的效果图如图3:图3选择图片文件查看图片的效果图如图4:图4图片缩小显示多次单击放大按钮后的效果图如图5所示:图5图片放大显示多次单击缩小按钮后效果图如图6所示:图6图片缩小显示单击原始按钮的效果图如图7所示:图7图片原始显示单击上一幅的效果图如图8所示:图8上一幅图片显示单击上一幅的效果图如图9所示:图9下一幅图片显示单击左旋按钮的效果如图10所示:图10图片左旋显示单击右旋按钮的效果如图11所示:图11图片右旋显示其他功能显示效果图如图12所示:图12其他功能效果显示4.2系统使用说明由于本组的知识水平能力有限,在制作此图片查看器时有许多有待完善的地方,因此用户在使用时应注意慎重使用删除与保存按钮,另外其他的操作只要单击按钮则行。特别值得注意原始按钮只有在对图片已经进行了放大或缩小的操作后其才是有效的。5、课程设计总结5.1遇到的问题和解决方法在用JAVA编写程序时,我们遇到了很多困难,对很多的接口,类,方法都不是很熟悉,只好采用查看API文档,一个一个进行对照学习,同时也上网查看了有关图片查看器的相关描述,还向同学请教了,翻阅了相关的书籍。尤其是因为有些方法需要使用JDK1.6才行,所以在学校网络机房一开始不能运行,在安装了1.6版本后运行正常了。另外文件在打开时会有严重的频闪问题,在重写了publicvoidupdate(Graphicsg){this.paint(g);}后解决了。5.2心得体会在此次的面向对象程序设计课程设计中,我们组更加深入地理解力JAVA语言中的包,类,方法:怎样导入哪些包,继承哪些类,程序运行时是按怎样的顺序运行索要继承的类,子类与父类之间的依存关系,可以实现什么方法等。深刻感受到了面向对象语言中类库的强大功能。与此同时,对于JAVA如何实现图形化界面有了深刻的认识。进一步掌握了eclipse软件的使用。但是由于我们自身掌握的知识有限,图片查看器的功能没有达到尽善尽美,尤其是删除操作,删除掉以后就没了,在回收站也找不到。还有就是单击“保存”按钮后似乎就不能进行其他操作,但这样的情况时有时无。通过这次的课程设计,我们懂得了要充分利用网络资源查找资料同时要多向同学请教并加强组内讨论,大家互相讨论进步得会很快。通过近两周的努力,这次课程设计圆满的结束了,在这个过程中,我们收获了很多的知识,温故而知新。在以后的学习中,我们会更加努力的学好专业知识,稳扎稳打,积极努力地把所学的知识运用到实践中去。参考文献[1]孙一林彭波,Java网络编程实例:清华大学出版社,2003[2]袁然郑自国,java案例开发集锦:电子工业出版社,2005[3]耿祥义,黑魔方Java基础教程:清华大学出版社,2004[4]RobertC.Martin著,黄晓春译.UMLFORJAVAPROGRAMMERS.清华大学出版社,2004附录importjava.awt.*;importjava.awt.event.*;importjava.awt.geom.*;importjava.awt.image.*;importjavax.swing.*;importjavax.swing.filechooser.*;importjava.io.*;importjava.applet.*;publicclassPicViewerextendsAppletimplementsActionListener{ JPanelpathBar,picContainer,ctrBar; JLabelpathInfo; JButtonopenbtn,prebtn,nextbtn,zoominbtn,zoomoutbtn,oripicbtn,angleleftbtn, anglerightbtn,exitbtn,deletebtn,savebtn; Imagepic;//查看的图片 BufferedImagebufImage;//用于显示的缓冲区图像 BufferedImageoriBufImage;//原始缓冲区图像 Graphics2DbufImageG;//缓冲区图像的图形环境 Stringpath,filename,dir;//需要查看图片的路径 String[]pics;//目录下所有指定格式的图片 intpicWidth,picHeight;//图片大小inti=0; finaldoubleZOOM_PERCENT=0.15;//每次放大和缩小的倍率 finalStringFILE_TYPE=".jpg"; booleanhasPic,isangled; doublescaleX;//图像水平方向的缩放因子 doublescaleY;//图像竖直方向的缩放因子 doubleradius;//旋转角度 FilterfilterJpg; publicvoidinit(){ //顶部路径栏 pathBar=newJPanel(); pathBar.setLayout(newBorderLayout()); pathInfo=newJLabel(); pathInfo.setText("图片查看器"); pathBar.add(pathInfo); //图片显示区域 picContainer=newJPanel(); picContainer.setBackground(Color.LIGHT_GRAY); //底部控制栏 ctrBar=newJPanel(); openbtn=newJButton("打开"); openbtn.addActionListener(this); savebtn=newJButton("保存"); savebtn.addActionListener(this); prebtn=newJButton("上一幅"); prebtn.addActionListener(this); nextbtn=newJButton("下一幅"); nextbtn.addActionListener(this); zoominbtn=newJButton("放大"); zoominbtn.addActionListener(this); zoomoutbtn=newJButton("缩小"); zoomoutbtn.addActionListener(this); oripicbtn=newJButton("原始"); oripicbtn.addActionListener(this); angleleftbtn=newJButton("左旋"); angleleftbtn.addActionListener(this); anglerightbtn=newJButton("右旋"); anglerightbtn.addActionListener(this); deletebtn=newJButton("删除"); deletebtn.addActionListener(this); exitbtn=newJButton("退出"); exitbtn.addActionListener(this); ctrBar.add(openbtn); ctrBar.add(zoominbtn); ctrBar.add(zoomoutbtn); ctrBar.add(oripicbtn); ctrBar.add(prebtn); ctrBar.add(nextbtn); ctrBar.add(angleleftbtn); ctrBar.add(anglerightbtn); ctrBar.add(deletebtn); ctrBar.add(savebtn); ctrBar.add(exitbtn); //界面总布局 setLayout(newBorderLayout()); add(pathBar,BorderLayout.NORTH); add(picContainer,BorderLayout.CENTER); add(ctrBar,BorderLayout.SOUTH); resize(640,480); scaleX=1.0; scaleY=1.0; radius=0.0; hasPic=false; isangled=false; dir=""; prebtn.setEnabled(false); nextbtn.setEnabled(false); zoominbtn.setEnabled(false); zoomoutbtn.setEnabled(false); angleleftbtn.setEnabled(false); anglerightbtn.setEnabled(false); oripicbtn.setEnabled(false); deletebtn.setEnabled(false); savebtn.setEnabled(false); } publicvoidactionPerformed(ActionEvente){ JButtonclick=(JButton)e.getSource();//获取按键源 if(click==openbtn){ open(); } if(click==prebtn&&pic!=null){ pre(); } if(click==nextbtn&&pic!=null){ next(); } if(click==zoominbtn&&pic!=null){ pathInfo.setForeground(Color.BLACK); pathInfo.setText("放大图片..."); zoomin(); } if(click==zoomoutbtn&&pic!=null){ pathInfo.setForeground(Color.BLACK); pathInfo.setText("缩小图片..."); zoomout(); } if(click==oripicbtn&&pic!=null){ oripic(); } if(click==angleleftbtn&&pic!=null){ angleleft(); } if(click==anglerightbtn&&pic!=null){ angleright(); } if(click==exitbtn){ exit(); } if(click==deletebtn&&pic!=null) { pathInfo.setForeground(Color.BLACK); pathInfo.setText("删除图片"); delete(); } if(click==savebtn&&pic!=null) { pathInfo.setForeground(Color.BLACK); pathInfo.setText("复制图片"); try { save(); }catch(Exceptionee) {} } } //line1,打开需要查看的图片文件 publicvoidopen(){ JButtonmsg=newJButton(); JFileChooserchooser=newJFileChooser(); //只显示文件夹和jpg格式的文件 FileNameExtensionFilterfilter=newFileNameExtensionFilter("*.JPG","jpg");//建立过滤器,只显示jpg chooser.setFileFilter(filter); chooser.setCurrentDirectory(newFile("")); intreturnVal=chooser.showOpenDialog(msg); //根据返回值判断是否选择了文件 if(returnVal==JFileChooser.APPROVE_OPTION){ //获取文件名 filename=chooser.getSelectedFile().getName(); //获取文件路径 path=chooser.getCurrentDirectory().getPath(); //获取文件路径下所有jpg文件 filterJpg=newFilter(FILE_TYPE); Filefile=newFile(path); pics=file.list(); pics=file.list(filterJpg); //跟踪选中的图片 for(intj=0;j<pics.length;j++) if(pics[j].equalsIgnoreCase(filename)) { i=j; break; } dir=path+"\\"+filename; hasPic=true; loadImage(dir); pathInfo.setForeground(Color.BLACK); pathInfo.setText(path+"\\"+filename); prebtn.setEnabled(true); nextbtn.setEnabled(true); zoominbtn.setEnabled(true); zoomoutbtn.setEnabled(true); angleleftbtn.setEnabled(true); anglerightbtn.setEnabled(true); deletebtn.setEnabled(true); savebtn.setEnabled(true); }else{ hasPic=false; pathInfo.setForeground(Color.RED); pathInfo.setText("没有选择文件!"); } } //保存文件 publicvoidsave()throwsIOException{ JButtonmsgsave=newJButton(); JFileChooserchooser=newJFileChooser(); //只显示文件夹和jpg格式的文件 FileNameExtensionFilterfilter=newFileNameExtensionFilter( "*.JPG","jpg");//建立过滤器,只显示jpg chooser.setFileFilter(filter); Filefin=newFile(path+"\\"+pics[i]); Filef=newFile(""+"\\"+pics[i]); chooser.setSelectedFile(f); intreturnVal=chooser.showSaveDialog(msgsave); //根据返回值判断是否选择了文件路径 if(returnVal==JFileChooser.APPROVE_OPTION){ //获取文件路径 path=chooser.getCurrentDirectory().getPath(); Filefileout=newFile(path+"\\"+chooser.getSelectedFile().getName()); FileInputStreamisr=newFileInputStream(fin); FileOutputStreamfout=newFileOutputStream(fileout); byteb[]=newbyte[200]; intcount=0; while((count=isr.read(b,0,200))!=-1) fout.write(b,0,count); isr.close(); fout.flush(); fout.close(); } } //line2,查看上一幅图片 publicvoidpre(){ //循环浏览图片 if(i==0){ i=pics.length-1; }else{ i--; } dir=path+"\\"+pics[i]; pathInfo.setText(dir); hasPic=true; isangled=false; scaleX=1.0; scaleY=1.0; loadImage(dir); oripicbtn.setEnabled(false); } //line3,查看下一幅图片 publicvoidnext(){ if(i==pics.length-1){ i=0; }else{ i++; } dir=path+"\\"+pics[i]; pathInfo.setText(dir); hasPic=true; isangled=false; scaleX=1.0; scaleY=1.0; loadImage(dir); oripicbtn.setEnabled(false); } //line4,放大图片 publicvoidzoomin(){ if(scaleX<1.7){ scaleX+=ZOOM_PERCENT; scaleY+=ZOOM_PERCENT; }else{ scaleX=1.8; scaleY=1.8; pathInfo.setForeground(Color.RED); pathInfo.setText("已经放到最大!"); } hasPic=true; picTrans(); repaint();//重绘组件 pathInfo.setForeground(Color.BLACK); pathInfo.setText(dir); if(scaleX==1){ oripicbtn.setEnabled(false); }else{ oripicbtn.setEnabled(true); } } //line5,缩小图片 publicvoidzoomout(){ if(scaleX>0.8){ scaleX-=ZOOM_PERCENT; scaleY-=ZOOM_PERCENT; }else{ scaleX=0.2; scaleY=0.2; pathInfo.setForeground(Color.RED); pathInfo.setText("已经缩至最小!"); } hasPic=true; picTrans(); repaint();//重绘组件 pathInfo.setForeground(Color.BLACK); pathInfo.setText(dir); if(scaleX==1){ oripicbtn.setEnabled(false); }else{ oripicbtn.setEnabled(true); } } //line6,回复图片原始状态 publicvoidoripic(){ scaleX=1; scaleY=1; radius=0; hasPic=true; picTrans(); repaint();//重绘组件 pathInfo.setForeground(Color.BLACK); pathInfo.setText(path+"\\"+filename); oripicbtn.setEnabled(false); } //line7,将图片逆时针旋转 publicvoidangleleft(){ isangled=true; radius+=-Math.PI/2;//设置每次左旋45度角 repaint(); oripicbtn.setEnabled(true); } //line8,将图片顺时针旋转 publicvoidangleright(){ isangled=true; radius+=Math.PI/2;//设置每次右旋45度角 repaint(); oripicbtn.setEnabled(true); } //图片删除 publicvoiddelete(){ Filef=newFile(path+"\\"+pics[i]); if(f.exists()) f.delete(); else { pathInfo.setForeground(Color.BLACK); pathInfo.setText("文件不存在"); } for(intj=i;j<pics.length-1;j++) pics[j]=pics[j+1]; if(i==pics.length-1) i=0; dir=path+"\\"+pics[i]; loadImage(dir); } //line9,退出图片查看器 publicvoidexit(){ hasPic=false; System.exit(1); } //line10,加载图像 publicvoidloadImage(StringfileName){ pic=this.getToolkit().getImage(fileName);//取得图像 MediaTrackermt=newMediaTracker(this);//实例化媒体加载器,跟踪多种媒体对象状态 mt.addImage(pic,0);//增加图像到加载器中 picWidth=pic.getWidth(this); picHeight=pic.getHeight(this); try{ mt.waitForAll();//等待图片加载 }catch(Exceptione){ e.printStackTrace();//输出出错信息 } oriBufImage=newBufferedImage(pic.getWidth(this),pic.getHeight(this),BufferedImage.TYPE_INT_ARGB); //创建原始缓冲区图像 bufImage=oriBufImage; bufImageG=bufImage.createGraphics();//创建bufImage的图形环境 bufImageG.drawImage(pic,0,0,this);//传输源图像数据到缓冲区图像中 repaint();//重绘组件 } //line11,图像转换处理publicvoidpicTrans(){ if(bufImage==null)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论