ImageVerifierCode 换一换
格式:DOC , 页数:9 ,大小:56KB ,
资源ID:9198359      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

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

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

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(通过Java-Swing看透MVC设计模式.doc)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

通过Java-Swing看透MVC设计模式.doc

1、通过Java Swing看透MVC设计模式 一个好的用户界面(GUI)的设计通常可以在现实世界找到相应的表现。例如,如果在您的面前摆放着一个类似于电脑键盘按键的一个简单的按钮,然而就是 这么简单的一个按钮,我们就可以看出一个GUI设计的规则,它由两个主要的部分构成,一部分使得它具有了按钮应该具有的动作特性,例如可以被按下。另外一 部分则负责它的表现,例如这个按钮是代表了A还是B。    看清楚这两点你就发现了一个很强大的设计方法,这种方法鼓励重用reuse,而不是重新设计redesign。你发现按钮都有相同的机理,你只要在按钮 的顶上喷上不同的字母便能制造出“不同”的按钮,而不用为了

2、每个按钮而重新设计一份图纸。这大大减轻了设计工作的时间和难度。   如果您把上述设计思想应用到软件开发领域,那么取得相似的效果一点都不让人惊奇。一个在软件开发领域应用的非常广泛的技术Model/View/Controller(MVC)便是这种思想的一个实现。   这当然很不错,但是或许您又开始疑惑这和java基础类JFC(Java Foundation Class)中的用户界面设计部分(Swing)又有什么关系呢?好的,我来告诉你。    尽管MVC设计模式通常是用来设计整个用户界面(GUI)的,JFC的设计者们却独创性的把这种设计模式用来设计Swing中的单个的组件 (Co

3、mponent),例如表格Jtable,树Jtree,组合下拉列表框JcomboBox等等等等。这些组件都有一个Model,一个View, 一个Controller,而且,这些model,view,controller可以独立的改变,就是当组件正在被使用的时候也是如此。这种特性使得开 发GUI界面的工具包显得非常的灵活。   好,来吧,让我来告诉你它是如何工作的。   MVC设计模式   就象我刚才指出的一样,MVC设计模式把一个软件组件区分为三个不同的部分,model,view,controller。   Model是代表组件状态和低级行为的部分,它管理着自己

4、的状态并且处理所有对状态的操作,model自己本身并不知道使用自己的view和controller是谁,系统维护着它和view之间的关系,当model发生了改变系统还负责通知相应的view。   View代表了管理model所含有的数据的一个视觉上的呈现。一个Model可以有一个以上的View,但是Swing中却很少有这样的情况。   Controller管理着model和用户之间的交互的控制。它提供了一些方法去处理当model的状态发生了变化时的情况。   使用键盘上的按钮的例子来说明一下:Model就是按钮的整个机械装置,View/Controller就是按钮的表面部分。

5、   下面的图解释了如何把一个JFC开发的用户界面分为model,view,controller,注意,view/Controller被合并到了一起,这是MVC设计模式通常的用法,它们提供了组件的用户界面(UI)。   用Button的例子详细说明   为了更好的理解MVC设计模式和Swing用户界面组件之间的关系,让我们更加深入的进行分析。我将采用最常见的组件button来说明。   我们从model来开始。   Model   一个按钮的model所应该具备的行为由一个接口ButtonModel来完成。一个按钮model实例封装了其内部的状态,并且定

6、义了按钮的行为。它的所有方法可以分为四类:   1、查询内部状态   2、操作内部状态   3、添加和删除事件监听器   4、发生事件   其他的用户界面组件有它们各自的与组件相关的Model,但是所有的组件Model都提供这四类方法。   View & Controller   上面的图中讲述一个按钮的view/controller由一个接口ButtonUI完成。如果一个类实现了这个接口,那么它将会负责创建一个用户界面,处理用户的操作。它的所有方法可以被分为三大类:   1、绘制Paint   2、返回几何类型的信息   3、处理A

7、WT事件   其他用户界面组件有他们自己的组件相关的View/Controller,但是他们都提供上述三类方法。    程序员通常并不会直接和model以及view/controller打交道,他们通常隐藏于那些继承自java.awt.Component的组件里 面了,这些组件就像胶水一样把MVC三者合三为一。也正是由于这些继承的组件对象,一个程序员可以很方便的混合使用Swing组件和AWT组件,然后,我 们知道,Swing组件有很多都是直接继承自相应的AWT组件,它能提供比AWT组件更加方便易用的功能,所以通常情况下,我们没有必要混合使用两者。   一个实例   现在

8、我们已经明白了Java类与MVC各个部分的对应关系,我们可以更加深入一点去分析问题了。下面我们将要讲述一个小型的使用MVC模式开发的例子。因为JFC十分的复杂,我只能把我的例子局限于一个用户界面组件里面(如果你猜是一个按钮的例子,那么你对了!)   让我们来看看这个例子的所有部分吧。   Button类   最显而易见的开始的地方就是代表了按钮组件本省的代码,因为这个类是大部分程序员会接触的。    就像我前面提到的,按钮用户界面组件类实际上就是model和view/controller的之间的黏合剂。每个按钮组件都和一个model以及一个 controller关联,m

9、odel定义了按钮的行为,而view/controller定义了按钮的表现。而应用程序可以在任何事件改变这些关联。让 我们看看得以实现此功能的代码。 public void setModel(ButtonModel buttonmodel) {  if (this.buttonmodel != null)  {   this.buttonmodel.removeChangeListener(buttonchangelistener);   this.buttonmodel.removeActionListener(buttonactionlistener);   button

10、changelistener = null;   buttonactionlistener = null;  }  this.buttonmodel = buttonmodel;  if (this.buttonmodel != null)  {   buttonchangelistener = new ButtonChangeListener();   buttonactionlistener = new ButtonActionListener();   this.buttonmodel.addChangeListener(buttonchangelistene

11、r);   this.buttonmodel.addActionListener(buttonactionlistener);  }  updateButton(); } public void setUI(ButtonUI buttonui) {  if (this.buttonui != null)  {   this.buttonui.uninstallUI(this);  }  this.buttonui = buttonui;  if (this.buttonui != null)  {   this.buttonui.installUI(

12、this);  }  updateButton(); } public void updateButton() {  invalidate(); }   在进入下一节之前,你应该多花一些时间来仔细阅读一下Button类的源代码。   ButtonModel类   ButtonModel维护着三种类型的状态信息:是否被按下(pressed),是否“武装上了”(armed),是否被选择(selected)。它们都是boolean类型的值。   一个按钮被按下(pressed)是指当鼠标在按钮上面的时候,按下鼠标但是还没有松开鼠标按钮的状态,及时用户此时把

13、鼠标拖拽到按钮的外面也没有改变这种状态。   一个按钮是否“武装了”(armed)是指按钮被按下,并且鼠标还在按钮的上面。   一些按钮还可能被选择(selected),这种状态通过重复的点击按钮取得true或者false的值。   下面的代码是状态pressed的一个缺省的实现。状态armed以及selected实现的代码与之类似。ButtonModel类应该被继承,这样可以覆盖缺省的状态定义,实现有个性的按钮。 private boolean boolPressed = false; public boolean isPressed() {  return b

14、oolPressed; } public void setPressed(boolean boolPressed) {  this.boolPressed = boolPressed;  fireChangeEvent(new ChangeEvent(button)); }   按钮的模型button model还负责通知其他对象(事件监听器)它们所感兴趣的事件。从下面的代买中我们可以看出当按钮的转台发生改变的时候就会发出一个ChangeEvent。下面就是代码: private Vector vectorChangeListeners = new Vector();

15、 public void addChangeListener(ChangeListener changelistener) {  vectorChangeListeners.addElement(changelistener); } public void removeChangeListener(ChangeListener changelistener) {  vectorChangeListeners.removeElement(changelistener); } protected void fireChangeEvent(ChangeEvent cha

16、ngeevent) {  Enumeration enumeration = vectorChangeListeners.elements();  while (enumeration.hasMoreElements())  {   ChangeListener changelistener =(ChangeListener)enumeration.nextElement();   changelistener.stateChanged(changeevent);  } }   在进入下一节之前,你应该多花一些时间来仔细阅读一下ButtonModel类的源代码。

17、  ButtonUI类   按钮的view/controller是负责构建表示层的。缺省情况下它仅仅是用背景色画一个矩形而已,他们的子类继承了他们并且覆盖了绘制的方法,使得按钮可以有许多不同的表现,例如MOTIF,Windows 95,Java样式等等。 public void update(Button button, Graphics graphics) { } public void paint(Button button, Graphics graphics) {  Dimension dimension = button.getSize();  Color c

18、olor = button.getBackground();  graphics.setColor(color);  graphics.fillRect(0, 0, dimension.width, dimension.height); }   ButtonUI类并不自己处理AWT事件,他们会使用一个定制的事件监听器把低级的AWT事件翻译为高级的Button模型期望的语义事件。下面就是安装/卸载事件监听器的代码。 private static ButtonUIListener buttonuilistener = null; public void installUI(B

19、utton button) {  button.addMouseListener(buttonuilistener);  button.addMouseMotionListener(buttonuilistener);  button.addChangeListener(buttonuilistener); } public void uninstallUI(Button button) {  button.removeMouseListener(buttonuilistener);  button.removeMouseMotionListener(buttonuili

20、stener);  button.removeChangeListener(buttonuilistener); }   View/Controller实际上就是一些方法。他们不维护任何自己的状态信息。因此,许多按钮的实例可以共享一个ButtonUI实例。ButtonUI是通过在方面的参数列表里面加上按钮的引用来区分各个不同的按钮。   同样,希望你能多花一些时间来看看ButtonUI类,然后咱们进入下一节。   ButtonUIListener类   ButtonUIListener类可以帮助Button类去转变鼠标或者键盘的输入为对按钮模型的操作。这个监听器类实

21、现了:MouseListener,MouseMotionListener,ChangeListener接口,并且处理一下事件: public void mouseDragged(MouseEvent mouseevent) {  Button button = (Button)mouseevent.getSource();  ButtonModel buttonmodel = button.getModel();  if (buttonmodel.isPressed())  {   if (button.getUI().contains(button, mouseevent.

22、getPoint()))   {    buttonmodel.setArmed(true);   }   else   {    buttonmodel.setArmed(false);   }  } } public void mousePressed(MouseEvent mouseevent) {  Button button = (Button)mouseevent.getSource();  ButtonModel buttonmodel = button.getModel();  buttonmodel.setPressed(true);  bu

23、ttonmodel.setArmed(true); } public void mouseReleased(MouseEvent mouseevent) {  Button button = (Button)mouseevent.getSource();  ButtonModel buttonmodel = button.getModel();  buttonmodel.setPressed(false);  buttonmodel.setArmed(false); } public void stateChanged(ChangeEvent changeevent) {  Button button = (Button)changeevent.getSource();  button.repaint(); }   总结    我希望你能按照上面讲述的方法去做。如果不能,那么所有的努力都将白费。这个例子以及Swing用户界面组件的好处在于你不用去花时间去弄明白他们底层 是如何设计实现的就可以很方便的使用他们了。他们都提供了缺省的model以及view/controller,然后,当你自己做组件的时候,你会发现上 面的思想的强大之处。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服