|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你说是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办法
- 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相干联:
- getElements(Objectparent)
- getChildren(Objectelement)
注重:JFace框架将挪用这些办法。
清单2.创立定制的ContentProvider
- publicclassExampleViewContentprovideimplementsITreeContentProvide{
复制代码 MVC架构一般包括多个视图和一个数据源。今朝在Eclipse平台上,只能把一个视图与一个模子相干联。可是,也能够创立多个视图,用适配器视图会见统一数据。只需把inputChanged()办法包括在ContentProvider类中便可。只需Viewer有新的输出集,就会利用inputChanged()办法关照ContentProvider。inputChanged()办法承受Viewer作为输出参数,以是多个视图可使用一个ContentProvider。
清单3.将inputChanged办法用于分歧的检察器
- /***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办法初始化结构
- publicvoidcreatePartControl(Compositeparent){ExampleEditLayout_layout=newExampleEditLayout(parent,SWT.NONE,FieldMode.Read,newExampleViewContentProvider());}
复制代码 创立表单和结构
基础结构类界说了分歧的表单使用程序利用的全局办法和声明。有些充任回调机制的容器事务,也注册到了这里。
清单5.结构的CreateControl办法
- 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类创立文本对象
- 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中完成办法
- 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.初始化结构并添补控件的表单
- 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并驾齐驱的 |
|