仓酷云

标题: JAVA编程:在定制Eclipse SWT组件中完成MVC [打印本页]

作者: 山那边是海    时间: 2015-1-18 11:13
标题: JAVA编程:在定制Eclipse SWT组件中完成MVC
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net性能上肯定会站上风的。  EclipseSWT(尺度部件工具包)供应了丰厚的API集来完成定制部件(widget)。在这篇文章中,作者扼要先容了MVC(模子-视图-把持器)架构,以布局化检察器的情势注释了MVC确当前完成,并先容了一种利用定制SWT部件的完成。

  甚么是MVC?

  MVC架构(或计划形式)是图形用户界面(GUI)的计划款式,由三部分组成:模子、视图和把持器。MVC把暗示层从数据解耦出来,也把暗示从数据的操纵解耦出来。

  完成MVC架构与其他范例的使用程序有所分歧。次要的区分来自若何安排和完成营业逻辑或检察出现逻辑。与典范的Web使用程序分歧,在这类程序中,程序员必需计划和完成一切MVC组件,而Eclipse供应的API能够替您做年夜部分把持或出现事情。以是,不克不及严厉地把Eclipse的MVC完成与Web或其他使用程序范例的MVC举行对照。

  EclipseJFace

  EclipseJFace用内容供应者和标签供应者完成MVC架构。JFaceAPI包装了尺度(并不是不主要的)部件,比方表和树,并完成了却构化内容供应者和标签供应者。能够依据部件范例完成分歧的内容供应者。面向列表的检察器会完成布局化检察器,而内容则以布局化(列表的)体例映照到部件条目上。

  基类叫做Viewer,它是布局化检察器的一个扩大。检察器充任部件容器。内容供应者以布局化的体例失掉数据;相似地,标签供应者取得对应的标签。JFace检察器完成检索该数据,设置对应的联系关系,并用数据集更新用户界面(UI)组件。它还实行选择、过滤和排序。

  怎样完成JFace

  EclipseView和Viewer卖力实行年夜部分JFace把持功效。Viewer大概说MVC的视图部分,也充任部件容器;这是暗示组件。

  EclipseView实例化Viewer、内容供应者和标签供应者,并充任模子,包容值对象,并在Viewer中把它们设置为inputElement。

  要创立View,请用createPartControl()办法实例化Viewer。清单1实例化一个默许的树检察器;您也能够定制树,并用树对象作为参数,用机关函数实例化树检察器。

  清单1.ExampleView的CreatePartControl办法
  1. publicclassExampleViewextendsViewPart{...publicvoidcreatePartControl(Compositeparent){//defineagridlayoutGridLayoutlayout=newGridLayout();layout.numColumns=1;layout.marginHeight=0;layout.marginWidth=0;layout.horizontalSpacing=0;layout.verticalSpacing=1;parent.setLayout(layout);//createwidgetscreateActionBar(parent);createTree(parent);//addcontextmenuandlistenersviewer.addDoubleClickListener(this);viewer.addSelectionChangedListener(openAction);//registerviewersoactionsrespondtoselectiongetSite().setSelectionProvider(viewer);hookContextMenu();}privatevoidcreateTree(Compositeparent){viewer=newTreeViewer(parent,SWT.SINGLE|SWT.H_SCROLL|SWT.V_SCROLL|SWT.BORDER);viewer.setContentProvider(newExampleViewContentProvider());viewer.setLabelProvider(newExampleViewLabelProvider());viewer.setSorter(newViewerSorter());viewer.setInput(ModelManager.getExampleModel());viewer.getControl().setLayoutData(newGridData(GridData.FILL_BOTH));}...}
复制代码
  在另外一个自力类中完成ContentProvider,它是一个对象,用合适检察器范例的接口向视图供应数据。比方,您能够完成IStructuredContentProvider或ITreeContentProvider检察器。

  请在ContentProvider代码中完成以下一个办法,把ContentProvider与Viewer相干联:

  注重:JFace框架将挪用这些办法。

  清单2.创立定制的ContentProvider
  1. publicclassExampleViewContentprovideimplementsITreeContentProvide{
复制代码
  MVC架构一般包括多个视图和一个数据源。今朝在Eclipse平台上,只能把一个视图与一个模子相干联。可是,也能够创立多个视图,用适配器视图会见统一数据。只需把inputChanged()办法包括在ContentProvider类中便可。只需Viewer有新的输出集,就会利用inputChanged()办法关照ContentProvider。inputChanged()办法承受Viewer作为输出参数,以是多个视图可使用一个ContentProvider。

  清单3.将inputChanged办法用于分歧的检察器
  1. /***Registercontentproviderwithmodel.*/publicvoidinputChanged(Viewerviewer,ObjectoldInput,ObjectnewInput){if(newInput!=null){this.viewer=viewer;this.model=(ExampleDelegate)newInput;this.model.addModelListener(this);}}
复制代码
  与EclipseSWT分离利用MVC

  在多半罕见GUI使用程序中,创立结构来显现哀求的数据,或完成表单(比方用户界面)来增加或修正数据。的示例使用程序演示了怎样在定制表单中,用只读和可编写形式显现来自XML存储的数据。它还注释了每一个组件相对MVC架构的脚色。

  .示例使用程序




显现了使用程序的类图,有助于更好地舆解全体架构。

  .示例使用程序的类图






  创立控件

  ExampleView充任全部使用程序的容器。它将在createPartControl办法中初始化使用程序。

  清单4.CreatePartControl办法初始化结构
  1. publicvoidcreatePartControl(Compositeparent){ExampleEditLayout_layout=newExampleEditLayout(parent,SWT.NONE,FieldMode.Read,newExampleViewContentProvider());}
复制代码
  创立表单和结构

  基础结构类界说了分歧的表单使用程序利用的全局办法和声明。有些充任回调机制的容器事务,也注册到了这里。

  清单5.结构的CreateControl办法
  1. publicvoidcreateControls(intstyle){GridDatagridData;TexttextFld,subjectFld;ControltoLabel,ccLabel,bccLabel;ControlfromDateTime;Controlcontrol;ButtondurationText;Buttonsubmit;GridLayoutlayout=newGridLayout(2,false);layout.marginWidth=0;layout.marginHeight=4;setLayout(layout);//LabelgridData=newGridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.VERTICAL_ALIGN_CENTER);gridData.horizontalIndent=10;LabelFactory.create(this,Messages.getString("ExampleEditLayout.Title"),gridData);//$NON-NLS-1$gridData=newGridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.VERTICAL_ALIGN_CENTER);gridData.horizontalIndent=40;LabelFactory.create(this,"",gridData);//TextgridData=newGridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.VERTICAL_ALIGN_CENTER);gridData.horizontalIndent=10;control=LabelFactory.create(this,Messages.getString("ExampleEditLayout.Email"),gridData);//$NON-NLS-1$gridData=newGridData(GridData.HORIZONTAL_ALIGN_BEGINNING|GridData.VERTICAL_ALIGN_CENTER);gridData.horizontalIndent=10;control=TextFactory.create(this,SWT.BORDER|SWT.V_SCROLL|SWT.WRAP,gridData,FieldMode.Edit);//$NON-NLS-1$addField(newTextField(control,ExampleViewContentProvider.FIRST_INDEX));//CombogridData=newGridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.VERTICAL_ALIGN_CENTER);gridData.horizontalIndent=10;LabelFactory.create(this,Messages.getString("ExampleEditLayout.Group"),gridData);//$NON-NLS-1$gridData=newGridData(GridData.HORIZONTAL_ALIGN_BEGINNING|GridData.VERTICAL_ALIGN_CENTER);gridData.horizontalIndent=40;control=ComboFactory.create(this,FieldMode.Edit,false,gridData);//$NON-NLS-1$addField(newComboField(control,ExampleViewContentProvider.SECOND_INDEX));...}
复制代码
  创立字段(视图)

  Field是一个笼统类,它界说了包括各类用户界面控件的办法,另有全局地辨认这些控件的相干ID。每一个用户界面控件都是Field的子类,并向内容供应者供应了读写才能。清单6用工场形式,在Layout类中创立了Field。

  清单6.用Field类创立文本对象
  1. publicclassTextFieldextendsField{/***@paramcontrol*@paramid*/publicTextField(Controlcontrol,intid){super(control,id);}/*BasedontheIDofthewidget,valuesretrievedfrom*thecontentproviderareset.*/publicvoidreadFromContent(IExampleContentProvidercontent){StringnewText=(String)content.getElement(getId());if(newText!=null)((Text)_control).setText(newText);}/*BasedontheIDofthewidget,valuesretrievedfromwidgetare*sentbacktothecontentprovider.*/publicvoidwriteToContent(IExampleContentProvidercontent){StringnewText=((Text)_control).getText();content.setElement(getId(),newText);}}
复制代码
  简化内容供应者(模子)

  ExampleViewContentProvider充任模子侦听器,后者扩大自IStructuredContentProvider。它是EclipseAPI的复杂完成,供应了用于检索数据的回调。每一个哀求数据的条目都基于视图创立时在结构中为条目界说的唯一ID。

  办法挪用会前往与每一个界说的全局ID联系关系的数据。在清单7所示的内容供应者中,可使用适配器从XML文件或数据库检索数据。

  清单7.在定制的ContentProvider中完成办法
  1. publicObjectgetElement(intiIndex){switch(iIndex){caseFIRST_INDEX:return"developer@ibm.com";caseSECOND_INDEX:returnnewInteger(1);caseFOURTH_INDEX:returnnewBoolean(true);caseTHIRD_INDEX:returnnewBoolean(false);caseFIFTH_INDEX:returnnewBoolean(false);}returnnull;}
复制代码
  创立了控件并初始化结构以后,表单会用控件ID请求内容供应者用数据添补表单控件。

  清单8.初始化结构并添补控件的表单
  1. publicForm(Compositeparent,intstyle,FieldModemode,ExampleViewContentProvidercontent){super(parent,style);_content=content;_style=style;setMode(mode);init(style);}privatevoidinit(intstyle){createControls(style);controlsCreated();}protectedvoidcontrolsCreated(){readFromContent();}
复制代码
  停止语

  Web使用程序是MVC架构款式的初期完成者。可是,跟着像Eclipse如许的复杂而壮大的开辟平台的到来,程序员能够容易地用更短的工夫和最小的庞大水平,开辟出更丰厚的用户界面。
最后我再次声明,我并没有说不看好java,实际上我对java很乐观的,毕竟她正在不断改进中,我相信她总有一天会和.net并驾齐驱的
作者: 海妖    时间: 2015-1-19 22:26
是一种突破用户端机器环境和CPU
作者: 深爱那片海    时间: 2015-1-25 05:43
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者: 简单生活    时间: 2015-2-1 12:28
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者: 若天明    时间: 2015-2-7 04:51
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: admin    时间: 2015-2-7 18:21
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
作者: 老尸    时间: 2015-2-7 18:58
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 愤怒的大鸟    时间: 2015-2-17 03:52
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者: 金色的骷髅    时间: 2015-2-17 08:38
是一种为 Internet发展的计算机语言
作者: 分手快乐    时间: 2015-2-21 06:24
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 乐观    时间: 2015-2-25 01:27
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者: 小女巫    时间: 2015-3-1 07:44
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 若相依    时间: 2015-3-10 12:57
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者: 因胸联盟    时间: 2015-3-11 07:17
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者: 柔情似水    时间: 2015-3-17 23:08
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: 山那边是海    时间: 2015-3-25 05:52
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2