ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:645.96KB ,
资源ID:19569418      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19569418.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(疯狂java实战演义第3章 图片浏览器Word下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

疯狂java实战演义第3章 图片浏览器Word下载.docx

1、.BMP , BMP (*.BMP);在文件对话框的addFilter方法加入以上的代码后,那么用户将不能看到.bmp的文件,并且在“文件类型”的下拉中也只能选择.bmp,效果如图3.3所示。在本章中,文件对话框对应的是ViewerFileChooser类。图3.3 文件过滤器的作用3.2.3 主界面类我们建立一个界面类作为图片浏览器的主界面,该类包括图片显示区、菜单栏、工具栏,并为工具栏与菜单栏加上事件监听器,如下: void init(),初始化图片浏览器的界面。 JLabel getLabel(),获取显示图片的JLabel。 createToolPanel(),创建放大、缩小、上一张、

2、下一张等工具按钮。 void createMenuBar(),创建文件、工具、帮助等菜单。在这里需要注意的是,由于打开的图片大小并不能确定,因此图片显示区必须使用JScrollPane。在本章中,主界面对应的是ViewerFrame类。3.2.4 业务处理类ViewerService业务处理类主要是处理图片浏览器的大部分业务逻辑,包括打开图片、关闭浏览器、放大图片、缩小图片、浏览上一张图片、浏览下一张图片等功能,如下: static ViewerService getInstance(),获取ViewerService类的一个单态实例。 void open( ViewerFrame frame

3、 ),弹出文件选择框,并读取被选择到的图片。 void zoom( ViewerFrame frame, boolean isEnlarge ),对正在浏览到的图片做放大或者缩小操作,这里可能会丢失图片精度。 void last( ViewerFrame frame ),浏览上一张图片。 next( ViewerFrame frame ),浏览下一张图片。 void menuDo( ViewerFrame frame, String cmd ),响应菜单的动作。在本章中,这个业务处理类并不是无状态的Java对象,也就是意味着本章的业务处理类将人保存一些业务状态,这些业务状态包括:当前浏览的文件

4、目录、文件目录的文件集合、图片放大或者缩小的比例等属性。由于我们这个是有状态的Java对象,那么就意味着,如果访问的是同一个实例,那么该对象的这些属性将会被所有的访问者共享,如果其中的一个访问者改变了其中一个或者多个属性,那么其他的访问者将会受到影响。当然,我们本章只是一个普通的图片浏览器,不存在多个用户使用同一个图片浏览器的情况。在本章中,业务处理类对应的是ViewerService类。3.2.5 操作处理类在本例中,由于用户可以执行的操作较少,因此,我们可以提供一个操作处理类来接收用户所有的操作,本例中的操作处理类是AbstractAction的一个子类,能用ImageIcon(图标)来创

5、建一个Action,再用这个Action来创建按钮,点击按钮的时候,将调用此类的actionPerformed方法: void actionPerformed( ActionEvent e ),重写AbstractAction的方法,响应事件。由于我们只有一个操作处理类,因此在实现actionPerformed方法时,我们就需要进行一系列的判断,让程序知道用户进行了何种操作,再调用业务处理类中的相应方法。到此,图片浏览器的相关对象都已经建立,并且确定了我们需要实现哪些方法,我们在实现的过程中,如果发现可以对程序进行重构,那么也可以在重构的过程中,创建相关的类。3.3 创建主界面这个图片浏览器的

6、界面排版比较简单,只有菜单(不需要排版)、工具栏、图片显示区,我们使用BorderLayout进行布局,把工具栏放在BorderLayout.NORTH,把图片显示区放在BorderLayout.CENTER。在本章中,由于打开图片的大小并不确定,因此我们需要使用一个JScrollPane来作为图片显示区域。3.3.1 初始化界面(init()方法)首先,设置JFrame窗口的标题,接下来初始化画图区域,初始化为白色,然后再获取PENCIL_TOOL(铅笔)类型的Tool,创建各种鼠标监听器,并在监听的执行方法中调用Tool的相应方法,最后获取左边工具栏面板、下面菜单栏面板、菜单,并把这些面板

7、与画图获取加到JFrame中,见以下代码。代码清单:codeviewersrcorgcrazyitviewerViewerFrame.javapublic void init() /设置标题 this.setTitle( 看图程序 ); /设置大小 this.setPreferredSize( new Dimension( width, height ) ); /创建菜单 createMenuBar(); /创建工具栏 JPanel toolBar = createToolPanel(); /把工具栏和读图区加到JFrame里面 this.add( toolBar, BorderLayout.

8、NORTH ); this.add( new JScrollPane(label), BorderLayout.CENTER ); /设置为可见 this.setVisible( true ); this.pack(); 首先是为JFrame设置标题,接下来设置大小,然后调用本类的createMenuBar()方法去创建菜单栏、调用createToolPanel()方法去创建工具栏,最后把菜单栏和图片显示区加到JFrame中(图片显示区只是一个JLabel)。以上代码中的黑体部分,使用一个createToolPanel的方法来创建菜单,该方法将在下面章节中实现。3.3.2 创建菜单栏菜单栏,必

9、须有事件响应,所以,先为菜单定义一个事件监听器,见以下代码。/加给菜单的事件监听器 ActionListener menuListener = new ActionListener() public void actionPerformed(ActionEvent e) service.menuDo( ImageFrame.this, e.getActionCommand() ); ;这个事件监听器实现了ActionListener中的actionPerformed方法,是响应用户操作的方法,方法里面的service类就是我们的业务逻辑处理类ImageService的一个单态实例。有了这个事件

10、监听器,就可以一次性创建出所有的菜单(用数组定义好菜单文字等东西的形式),见以下方法。public void createMenuBar() /创建一个JMenuBar放置菜单 JMenuBar menuBar = new JMenuBar(); /菜单文字数组,以下面的menuItemArr一一对应 String menuArr = 文件(F), 工具(T)帮助(H) /菜单项文字数组 String menuItemArr = 打开(O),-退出(X), 放大(M)缩小(O)上一个(X)下一个(P), 帮助主题关于 ; /遍历menuArr与menuItemArr去创建菜单 for( int

11、 i = 0 ; i menuArr.length ; i+ ) /新建一个JMenu菜单 JMenu menu = new JMenu( menuArri ); for( int j = 0 ; j menuItemArri.length ; j+ ) /如果menuItemArrij等于 if ( menuItemArrij.equals( ) ) /设置菜单分隔 menu.addSeparator(); else /新建一个JMenuItem菜单项 JMenuItem menuItem = new JMenuItem( menuItemArrij ); menuItem.addActio

12、nListener( menuListener ); /把菜单项加到JMenu菜单里面 menu.add( menuItem ); /把菜单加到JMenuBar上 menuBar.add(menu); /设置JMenubar this.setJMenuBar( menuBar );图片浏览器的菜单是这样的结构:文件(F)打开(O)退出(X)工具(T) 放大(M)缩小(O)上一个(X)下一个(P)帮助(H) 帮助主题 关于 从代码中可以看到,程序用两个数组把这两层菜单的文字保存了进去,两个数组一起遍历,每次都创建一个菜单项(JMenuItem),并为这个菜单项增加上前面定义的事件监听器,然后把这

13、个菜单项加到JMenu中。每次遍历完第一个数组,都把这个JMenu加到JMenuBar中。遍历完所有数组,就把这个JmenuBar加到JFrame里面,创建菜单的过程就完成了。3.3.3 创建工具栏这里的工具按钮,为了美观,想用图片的方式创建JButton,这里就要用到AbstractAction,也就是我们扩展的ViewerAction类,首先是用ViewerAction的ViewrAction(ImageIcon icon, String name, ViewerFrame frame)去创建一个ViewrAction,参数里面的icon对象就是从本地路径中读了图标的图标类,然后以这个Vi

14、ewerAction对象为参数去创建一个JButton。见以下代码。public JPanel createToolPanel() /创建一个JPanel JPanel panel = new JPanel(); /创建一个标题为工具的工具栏 JToolBar toolBar = new JToolBar( /设置为不可拖动 toolBar.setFloatable( false ); /设置布局方式 panel.setLayout( new FlowLayout( FlowLayout.LEFT ) ); /工具数组 String toolarr = openlastnextbigsmall

15、 toolarr.length ; ViewerAction action = new ViewerAction( new ImageIcon(img/ + toolarri + .gif) , toolarri, this ); /以图标创建一个新的button JButton button = new JButton( action ); /把button加到工具栏中 toolBar.add(button); panel.add( toolBar ); /返回 return panel;以上代码的黑体部分,我们使用了JButton来创建工具栏的图标,每一个JButton对象都使用Viewe

16、rAction作为构造参数,但是需要注意的是,各个JButton之间并不是共享一个ViewerAction的实例。创建完菜单与工具栏后,可以运行查看具体的效果,主界面的效果如图3.4所示。图3.4 图片浏览器主界面在本例中,图片浏览器的功能相对较为简单,因此界面也是较为简洁。如果想做更强大的图片浏览器,可以参考ACESee或者Windows图片浏览器等功能。3.4 实现图片浏览的操作ViewerService类主要是处理图片浏览器的大部分业务逻辑,包括打开图片、关闭浏览器、放大图片、缩小图片、浏览上一张图片、浏览下一张图片等功能,在这里需要再做一次说明,ViewerService是有状态的Ja

17、va对象。3.4.1 实现工具栏点击我们在3.2.5中创建了一个ViewerAction的类,主要用于处理工具栏的点击事件,当用户点击了工具栏的某个操作时,就会执行ViewerAction的actionPerformed的方法。我们在3.3.3中创建工具栏时,使用了以下代码。以上代码中使用了“open”、“last”等字符串用来标识应该使用ViewerService的哪个方法,那么就意味着我们需要在actionPerformed方法中作出这些判断: if (this.name.equals() /打开文件对话框 else if (this.name.equals( /上一下图片 本章中只有5个

18、Action,就需要写5次的ifelse,对于这样的代码,我们在本书的第二章(仿Windows计算器)中已经出现,当前并没有提供任何的解决方案,但是如果程序中出现如些之多的ifelse,那么我们就需要想办法去解决。接下来,创建一个Action的接口,提供一个execute的方法。codeviewersrcorgcrazyitvieweractionAction.javapublic interface Action /* * 具体执行的方法 * param service 图片浏览器的业务处理类 * param frame 主界面对象 */ void execute(ViewerService

19、 service, ViewerFrame frame);编写了接口Action后,我们定义了一个execute的方法,那么,我们可以为该Action新建实现类,例如有一个打开文件对话框的Action,那么我们就新建一个OpenAction,该类实现Action接口。以下代码是OpenAction的具体的实现。codeviewersrcorgcrazyitvieweraction OpenAction.java public void execute(ViewerService service, ViewerFrame frame) /打开文件对话框提供了这个OpenAction后,我们需要修

20、改创建工具栏的代码,换一种方式创建工具栏。 / 工具数组org.crazyit.viewer.action.OpenAction, org.crazyit.viewer.action.LastActionorg.crazyit.viewer.action.NextActionorg.crazyit.viewer.action.BigActionorg.crazyit.viewer.action.SmallAction for (int i = 0; toolarr.length; i+) ViewerAction action = new ViewerAction(new ImageIcon(

21、 + toolarri + ), toolarri, this); / 以图标创建一个新的button JButton button = new JButton(action); / 把button加到工具栏中将原来的字符串更换为某个Action实现类的全限定类名,那么在构造ViewerAction的时候,就可以使用这个参数去创建具体的某个实现类。为ViewerAction编写一个工具方法,使用反射得到Action接口的某个实现类。codeviewersrcorgcrazyitviewerViewerAction.java private Action getAction(String act

22、ionName) try if (this.action = null) /创建Action实例 Action action = (Action)Class.forName(actionName).newInstance(); this.action = action; return this.action; catch (Exception e) return null;以上的黑体代码,使用了反射来创建一个实例,并且该实例在ViewerAction中只有一个实例,由于该方法在ViewerAction中,所以我们在构造ViewerAction的时候,将对应的处理类传入即可。得到具体的某个Action实现类后,在实现ViewerAction的时候,我们就可以不必使用那堆烦人的ifelse了,直接通过以上的工具方法(getAction)得到相关的Action实现类,再调用Action的execute方法即可。 public void actionPerformed(ActionEvent e) ViewerService service = ViewerService.getInstance(); Action action = getAction(this.actionName); /调用Actio

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1