疯狂java实战演义源码第03章图片浏览器_第1页
疯狂java实战演义源码第03章图片浏览器_第2页
疯狂java实战演义源码第03章图片浏览器_第3页
疯狂java实战演义源码第03章图片浏览器_第4页
疯狂java实战演义源码第03章图片浏览器_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

首先需要创建浏览器的相关对象。先创建浏览器的界面对象ViewerFrame,然后在该类中,为菜单、按钮加了器,所以定义了一个继承Action的类ViewerAction来响应这些动作。在Action中响应动作,就到处理具体逻辑的步骤,把所有的逻辑处理放到程序更好的解耦合,可以把具体的某些业务处理放置到独立的类中进行处理。除了以上所说的几个类,由于这个程序有打开的操作,所以需要一个文件过滤器(只能选文件过滤器。本章中所涉及的对象及它们之间的关系如图3.2所示。图3.2浏览器类如果要使文件框实现文件过滤功能,就需要结合FileFilter类来进行文件操作,文件过滤器是FileFilter的一个继承,也是文件框的类,里面重写了FileFilter的accept与getDescription方booleanaccept(Filef),判断文件是否属于类型文件过滤器主要在用户打开时使用,当用户进行了选择后,就可以对用户所选择的文件进 们所定义的文件,那么其他的文件将不会被显示。在本章中,文件过滤器是文件框类 (MyFilFilter文件Java文件框的实现比较简单,只要使用JFileChooser类并提供一个自己的构造器即可。这里的文件框对象是JFileChooser类的子类,目的是为了加入在3.2.1中定义的文件过滤器:该对象中的addFilter方法主要用于向文件框加入文件过滤器,例如 需要只显示.bmp的文件,那么可以在addFilter方法中使用以下代码实现:this.addChoosableFileFilter(newMyFileFilter(newString[]{".BMP"},"BMP(*.BMP)")); 件类型”的下拉中也只能选择.bmp,效果如图3.3所示。在本章中,文件框对应的3.3建立一个界面类作为浏览器的主界面,该类包括显示区、菜单栏、,并为工具voidinit(),初始化浏览器的界面在这里需要注意的是,由于打开的大小并不能确定,因此显示区必须使用JScrollPane。在本章中,主界面对应的是ViewerFrame类。业务处理类主要是处理浏览器的大部分业务逻辑,包括打开、关闭浏览器、放大、缩小、浏览上一张、浏览下一张等功能,如下:voidopen(ViewerFrameframe),弹出文件选择框,并被选择到的voidzoom(ViewerFrameframe,booleanisEnlarge),对正在浏览到的做放大或者缩小操作,这里可能会丢失精度。voidlast(ViewerFrameframe),浏览上一张next(ViewerFrameframe),浏览下一张 DoViewerFrameframeStringcmdJava对象,也就是意味着本章的业务处理类将人保存一些业务状态,这些业务状态包括:当前浏览的文件、文件的文件集合、放大或者缩小的比例等属性。由于这个是有状态的Java对象,那么就意味着,如果的是同一个实例,那么该对象的这些属性将会被所有的者共享,如果其中的一个者改变了其中一个或者多个属性,那么其他的者将会受到影响。当然,本章只是一个普通的浏览器,不存在多个用户使用同一个浏览器的情况。在本章务处理类对应的是ViewerService类。 再用这个Action来创建按钮,点击按钮的时候,将调用此类的actionPerformed方法: 只有一个操作处理类,因此在实现actionPerformed方法时, 到此,浏览器的相关对象都已经建立,并且确定了 这个浏览器的界面排版比较简单,只有菜单(不需要排版、 BorderLayout进行布局,把放在BorderLayout.NORTH,把显示区放在首先,设置JFrame窗口的标题,接下来初始化画图区域,初始化为白色,然后再获取最后获取左边面板、下面菜单栏面板、菜单,并把这些面板与画图获取加到JFrame中,见以下publicvoidinit()publicvoidinit()(" JPaneltoolBar= }JFramecreateBar()方法去创建菜单createToolPanel()方法去创建,最后把菜单栏和显示区加到JFrame中(显示JLabel器Listener=器Listener=ActionListener(){publicvoidactionPerformed(ActionEvente){ Do(mand()} publicvoid Bar() JJBar=newItemArr Arr文件(F工具(T帮助(H)" ItemArr={{"打开(O)","-", "{"帮 ","关于" Arrfor(inti=0;iJArr.length;i++)=new(Arr[i]for(intj=0;j ItemArr[i].length;j++)//如 if ItemArr[i][j].equals("-"))}else Item=new ItemArr[i][j]Listener Item}} }//设置 Bar}文件打开工具放大缩小上一个下一个帮助创建一个菜单项(JItem,并为这个菜单项增加上前面定义的器,然后把这个菜单项加到J中。每次遍历完第一个数组,都把这个J加到JBar中。遍历完所有数组,就把这个JBar加到JFrame里面,创建菜单的过程就完成了。使用了JButton的图标,每一个JButton 后,可以运行查看具体的效果,主界面的效果如图3.4所示public使用了JButton的图标,每一个JButton 后,可以运行查看具体的效果,主界面的效果如图3.4所示publicJPanelcreateToolPanel()JPanelpanel=newJToolBartoolBarnewJToolBar(工具String[]toolarr={"open","last","next","big","small"};for(inti=0;i<toolarr.length;i++){ViewerActionaction=newnewImageIcon("img/"+toolarr[i]+,toolarr[i],thisJButtonbutton=newJButton(action }}图3.4浏览器主界器,可以参考ACESee或者Windows浏览器等功能。实现浏览的操ViewerService类主要是处理浏览器的大部分业务逻辑,包括打开、关闭浏览器、放大图片、缩小、浏览上一张、浏览下一张等功能,在这里需要再做一次说明,ViewerService是有状态的Java对象。在3.2.5中创建了一个ViewerAction的类,主要用于处理的点击,当用户点击了工具栏的某个操作时,就会执行ViewerAction的actionPerformed的方法。在3.3.3中创建时,String[]toolarr=String[]toolarr={"open","last","next","big","small"};for(inti=0;i<toolarr.length;i++){ViewerActionaction=newnewImageIcon("img/"+toolarr[i]+,toolarr[i],thisJButtonbutton=newJButton(action } }elseif(.equals("last"))}…5Action5if…else,对于这样的代码,在本书的第二章(仿Windows计算器)中已经出现,当前并没有提供任何的解决方案,但是如果程序中出现如些之多的publicpublicinterfaceAction*@paramframe} 例一个打开文件框的Action,那么 代码是OpenAction的具体的实现。 。 //String[]toolarr={"org.crazyit.viewer.action.OpenAction","org.crazyit.viewer.action.SmallAction"};for(inti=0;i<toolarr.length;i++)ViewerActionaction=newViewerAction(new+toolarr[i]+".gif"),toolarr[i],//以图标创建一个新的buttonJButtonbuttonnewJButton(action);//把button加 }publicvoidexecute(ViewerServiceservice,ViewerFrameframe) }{tryif(this.action==null)Actionaction=this.action=}return{return}}ViewerAction中,所以在构造ViewerAction的时候,将对应的处理类传入即可。得到具ActionViewerAction的时候,if…else了,publicvoidactionPerformed(ActionEventpublicvoidactionPerformed(ActionEvent{ViewerServiceservice=ViewerService.getInstance();Actionaction=if…else可能比这样做更省事,但是,如果站在程序可扩展的角度看,当需要为浏览器添加行为时,就不必再ViewerActionActionViewerAction类,只需要去修改使用者(主界面对象。对于一些简单的程序,可以使用if…else来解决,但是没有publicpublicDo(ViewerFrameframe,Stringcmd)){open(frame}{zoom(frame,true}(O)")){zoom(frame,false);}if(if(cmd.equals("上一个(Xlast(frame}{next(frame} {System.exit(0}} publicvoidopen(ViewerFrameframe)publicvoidopen(ViewerFrameframe)==ViewerFileChooser.APPROVEOPTION)this.currentFile=Stringname=Filecd=if(cd!=||this.currentDirectory==null)FileFilter[]fileFilters=fileChooserFilefiles[]=cd.listFiles();for(Filefile:files){for(FileFilterfilter:fileFilters) if( ccept(file))}}}}ImageIconicon=newImageIcon(name}}在文件的过程中,先调用ViewerFileFilter中的getChoosableFileFilters()方法获取自定义的文件过滤器,如果到的文件类型属于当前的文件过滤器中允许的类型,就把这个文件加到currentFiles中缓存起来。Image中有一个叫getScaledInstance的方法,能根据宽度去按比例改变的大小。在这个缩放publicvoidzoom(ViewerFramepublicvoidzoom(ViewerFrameframe,booleanisEnlarge)doubleenLargeRange=isEnlarge?1+range:1-if(icon!=null){intwidth=(int)(icon.getIconWidth()*ImageIconnewIcon=newImageIcon(.getScaledInstance(width,-1,Image.SCALEDEFAULT)}}getIconImageIcongetIconWidthgetScaledInstanceImageIconsetIcon方法把这设置到JLabelpublicvoidlast(ViewerFrameframe)publicvoidlast(ViewerFrameframe) {intindex=.indexOf(this.currentFile)if(index>0)Filefile=(File)this.currentFiles.get(index-1);ImageIconicon=newImageIcon(file.getPath());frame.getLabel().setIcon(icon);this.currentFile=}}}currentFilecurrentFiles都不为空(证明当前是有打开文件的),那就用currentFileFilegetPath()方法得到文件的路径,然后以这个为参数来创建一个ImageIcon,最后把它设置到JLabel中。使用JFileChooser创建文件框流程是先使用构造器创建一个JFileChooser对象,然后调用JFileChooser对象的showXXXDialog的方法显示文件框,如果需要对文件进行过滤,就需要调用addChoosableFileFilter(FileFilterfilter)方法添加文件过滤器,见以下代码。privatevoidprivatevoid{this.addChoosableFileFilter(newnewString[]{".BMP"},"BMP(*.BMP)")this.addChoosableFileFilter(newMyFileFilter(new"JPEG(*.JPG;*.JPEG;*.JPE;*.JFIF)")this.addChoosableFileFilter(newMyFileFilter(newString[]{".GIF"},"GIF(*.GIF)"));newString[]{".TIF",".TIFF"},"TIFF(*.TIF;*.TIFF)")MyFileFilter(newString[]{".PNG"},"PNG(*.PNG)"));MyFileFilter(newString[]{".ICO"},"ICO(*.ICO)"));这里是把bmpjpggif等类型的文件过滤器都加到JFileChooser中,留意到这里是调用publicMyFileFilter(String[]publicMyFileFilter(String[]suffarr,Stringdecription{this.suffarr=suffarr;this.suffarr=suffarr;} publicbooleanaccept(publicbooleanaccept(Filef)for(Strings:suffarr){if(f.getName().toUpp

温馨提示

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

评论

0/150

提交评论