仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 539|回复: 11
打印 上一主题 下一主题

[学习教程] JAVA编程:Eclipse Forms计划大度UI之结构

[复制链接]
飘灵儿 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:13:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
什么时候上述的三种开发工具能和三为一,什么时候java的竞争力才更强,才有机会拉拢更多的程序员投入到对java的开发上,因为到时的开发工具将会比.net的更简单。还有一点也很关键,什么时候java推出的jsf能成为真正意义上的标准。计划  增添一些内容

  如今我们已有一个view可以乐成运转了.我们能够往内里增添一些内容.Eclipseforms有一个body,我们能够如许创立内容.
  1. publicvoidcreatePartControl(Compositeparent){toolkit=newFormToolkit(parent.getDisplay());form=toolkit.createForm(parent);form.setText("Hello,EclipseForms");GridLayoutlayout=newGridLayout();form.getBody().setLayout(layout);Hyperlinklink=toolkit.createHyperlink(form.getBody(),"Clickhere.",SWT.WRAP);link.addHyperlinkListener(newHyperlinkAdapter(){publicvoidlinkActivated(HyperlinkEvente){System.out.println("Linkactivated!");}});}
复制代码
  form的body是题目上面的可用空间,由于这个空间是一个SWTComposite,它能做为别的组件的parent。在下面的代码里,我们为body设置了layout,然后创立了一个超链接。超链接是由EclipseForms供应的为数未几的组件之一,我们能够为超链接增添监听器,如许可以在用户点击它时做出反响。

  晋级后的视图应当看起来象如许:



:一个有超链接的复杂form.

  超链接组(HyperlinkGroups)

  Formtookit有一个"超链接组"对象.每一个创立出的超链接都到场这个组对象中.超链接为多个脚色服务.它们界说了这个组中一切超链接在一般、hover、激活分歧形态下的色彩.它们依据小组中链接分歧的形态来改动色彩.它们依据小组中链接分歧的形态来改动下划线作风.

  当你要改动超链接组对象的默许设置时,能够经由过程toolkit的getHyperlinkGroup()办法来取得超链接组对象.

  创立一般组件

  EclipseForms的一个计划方针就是让可以在编纂器/视图中创立一般SWT组件.由于form的body是一个一般composite,你可以在它内里利用任何layout和组件.可是,记着"原生的"SWT组件有一个组件背景.我们如今经由过程它们的机关办法创立一些组件.
  1. layout.numColumns=2;GridDatagd=newGridData();gd.horizontalSpan=2;link.setLayoutData(gd);Labellabel=newLabel(form.getBody(),SWT.NULL);label.setText("Textfieldlabel:");Texttext=newText(form.getBody(),SWT.BORDER);text.setLayoutData(newGridData(GridData.FILL_HORIZONTAL));Buttonbutton=newButton(form.getBody(),SWT.CHECK);button.setText("Anexampleofacheckboxinaform");gd=newGridData();gd.horizontalSpan=2;button.setLayoutData(gd);
复制代码
  如今我们利用了两列,而且创立了一个标签(label),一个文本框(textfield)和一个复选框(checkbox).了局以下:

[img=240border=0style=,183alt=]http://www.alixixi.com/UploadPic/2007-7/200777114051663.gif[/img]
:一个具有间接用它们的机关器创立出的SWT组件的form

  这张图片怎样回事?我们创立的组件的背景间接和体系窗口背景相婚配,而不是和form的背景婚配.别的,文本框看起来还好是由于这张截图是在WindowsXP下截的.在别的操纵体系上,它会看起来是有一个3D边框的空缺条.为懂得决这个成绩,我们会用toolkit的工场办法来创立这些组件:
  1. Labellabel=toolkit.createLabel(form.getBody(),"Textfieldlabel:");Texttext=toolkit.createText(form.getBody(),"");text.setLayoutData(newGridData(GridData.FILL_HORIZONTAL));Buttonbutton=toolkit.createButton(form.getBody(),"Acheckboxinaform",SWT.CHECK);gd=newGridData();gd.horizontalSpan=2;button.setLayoutData(gd);
复制代码
  这个视图如今会看来更好些了:


:一个具有用formtoolkit的工场办法创立出的SWT组件的form

  由formtoolkit供应的工场办法是为了便利。Toolkit没有函盖一切情形,乃至是SWT组件汇合,并且分明没无为你大概有的本人定制的组件供应这一便当.当你必要使一个SWT组件与form一致时,你应当利用一个办法:FormToolkit.adapt(Controlcontrol,booleantrackFocus,booleantrackKeyboard).一切的工场办法各自分离挪用了这个适配办法。

  到达"光滑"的视觉效果

  一个在PDE编纂器中EclipseForms的可看出的属性是组件的"光滑"视觉效果.之前一切没有3D边框的组件在窗口中看起来不错,可是在编纂器或视图中就不可.这个撑持写在FormToolkit类中.可是,在一些体系上它是经由过程一些定制到达的.举个例子,看一下这张从PDE编纂器(2.1版本)中的截图:

[img=545border=0style=,507alt=]http://www.alixixi.com/UploadPic/2007-7/200777114051313.gif[/img]

图片6:Eclipse2.1中EclipseForms的光滑视觉效果.

  象表格,文本类,复选框等,是加上一个光滑的1个象素宽的边框.这些边框不是来自组件本人(SWT.BORDER作风没有效到).别的,假如设置一下,tookit会为每一个组件的parent增添一个paint监听器,在paint事务产生时为组件加上边框.要想如许的话,你必要为你创立的象文本,表格,树等组件的每一个composite挪用paintBordersFor(parent).每一个parent只必要挪用一次办法就充足了:不必要为每一个组件如许挪用.

  Formtoolkit晓得哪一个组件必要一个定制的边框.可是,你大概新创立了一个不在本来名单中的组件,它也必要一个边框.你能够经由过程象上面如许的代码给toolkit一个提醒:
  1. ControlmyControl=newMyControl(parent);myControl.setData(FormToolkit.KEY_DRAW_BORDER,[b]FormToolkit.TEXT_BORDER[/b]);//ormyControl.setData(FormToolkit.KEY_DRAW_BORDER,[b]FormToolkit.TREE_BORDER[/b]);toolkit.paintBordersFor(parent);
复制代码
  你能够在下面这张图中看出,象树和表格如许的"布局化(structural)"的组件有和文本地区分歧的边框作风而且你能够选择和你的组件符合合的谁人.注重用toolkit的工场办法创立出的组件不必要如许做.

  由于Eclipse3.0和在WindowsXP上,当javaw.exe.manifest文件在Java假造机bin文件夹中时,没有边框发生出来.(这篇文章里我一切截图都是在WindowsXP下截的).这个文件--你能够在SWThomepage高低载--告知toolkit为当地组件利用XP皮肤.用XP皮肤,象文本,表格和树是已光滑的而且不必要再往调剂.为了让你的代码具有可移植性,你能够老是挪用paintBordersFor(Composite)办法,让toolkit往依据分歧操纵体系来决意该怎样做。

  定制结构(Customlayouts)

  EclipseForms在SWTlayout的基本上增添了两个新的layout,这些layout承继了SWTLayout基类并可以在任何SWTcomposite上利用,可是一样平常都是和EclipseForms团结利用的。

  TableWrapLayout

  如今我们晓得怎样来组合一个form,让我们先给一个牵挂.我们会改动谁人超链接文本使它加长一些:

link.setText("Thisisanexampleofaformthatismuchlonger"+
"andwillneedtowrap.");

  让我们看看了局:


图片7:一个利用GridLayout的form

  产生甚么事了?记着我们利用的是GridLayout,当它问这个超链接组件来盘算它巨细时,超链接告知它笔墨在独自行里必要的长度,固然我们告知组件往包裹(wrap),它并没有如许做由于GridLayout必要组件前往它的长度。超毗连组件--和别的象Label一样的SWT组件,能够经由过程你传送它数值来决意长和宽,可是GridLayout不会向组件传送数值参数。

  我们必要的是一个象HTML表格一样的layout.我们但愿内容往试图共同供应的客户空间,而且一行行地叠加.EclipseForms供应了一个如许的layout叫TableWrapLayout.GridLayout和TableWrapLayout之间有很多配合点.都是用表格来构造parent的children.都有layoutdata来告知layout怎样看待每一个组件.都可以在必要占有一切空间时等承受组件的提醒.

  可是,它们在结构时完整分歧.TableWrapLayout从列入手下手.它盘算每列的最小的,符合的,最年夜的宽度并用这个信息来占有空间.它也试图尽量地公允地在各列间分开,如许有些组件就没有过剩的空间.

  让我们利用TableWrapLayout来从头变动例子(变动处高亮显现):
  1. publicvoidcreatePartControl(Compositeparent){toolkit=newFormToolkit(parent.getDisplay());form=toolkit.createForm(parent);form.setText("Hello,EclipseForms");[b]TableWrapLayoutlayout=newTableWrapLayout();[/b]form.getBody().setLayout(layout);Hyperlinklink=toolkit.createHyperlink(form.getBody(),"Clickhere.",SWT.WRAP);link.addHyperlinkListener(newHyperlinkAdapter(){publicvoidlinkActivated(HyperlinkEvente){System.out.println("Linkactivated!");}});link.setText("Thisisanexampleofaformthatismuchlongerandwillneedtowrap.");layout.numColumns=2;[b]TableWrapDatatd=newTableWrapData();td.colspan=2;link.setLayoutData(td);[/b]Labellabel=toolkit.createLabel(form.getBody(),"Textfieldlabel:");Texttext=toolkit.createText(form.getBody(),"");[b]td=newTableWrapData(TableWrapData.FILL_GRAB);text.setLayoutData(td);[/b]Buttonbutton=toolkit.createButton(form.getBody(),"Acheckboxinaform",SWT.CHECK);[b]td=newTableWrapData();td.colspan=2;button.setLayoutData(td);[/b]}
复制代码
  1.   我们用了GridData不异的观点.一些变量具有分歧的名字(举个例子,colspan和rowspan,align和valign取自HTMLTABLE的属性),可是你能够做不异的事--创立一个超链接和按钮占有两列的格子.由于空缺(margins)和GridLayout是不异的,了局会看起来一样,除超链接如今会包裹起来:
复制代码
  1. [img=233border=0style=,177alt=]http://www.alixixi.com/UploadPic/2007-7/200777114052341.gif[/img]
  2. 图片8:一个利用TableWrapLayout的form
复制代码
  TableWrapLayout和GridLayout的一个次要的分歧点是你应当中断往盘算垂直的空间.在GridLayout里,你一样平常会让"不容易变形的(rigid)"组件用天然的地位和巨细并让"可伸缩的(flexible)"组件往占有程度或垂直的空间.相反,TableWrapLayout是从上往下事情的,而且它容下一切的组件,它的事情是完整的.占有程度空间的观点还存在(象下面展现一样).可是,垂直偏向上,你只能在单位(cell)比组件高时选择FILL单位,或选择TOP,MIDDLE或BOTTOM垂直对齐.

  你大概会注重到一个中央和方才说的不符:TableWrapLayout仍旧有一个grabVertical变量.可是,这里这个变量在这里有明白的目标:当一个设置了高度的组件占多行时,它的高度会给出一个前提就是垂直dimension已晓得了,组件必要往除它地点的多个单位之间的过剩空间.

  为了用TableWrapLayout有好的了局,断定组件能够靠近作风(SWT.WRAP).EclipseFroms供应的组合定制组件可以在box表面包裹.这是经由过程完成ILayoutExtension接话柄现的:

publicinterfaceILayoutExtension{
/**
*Computestheminimumwidthoftheparent.Allwidgetscapableofword
*wrappingshouldreturnthewidthofthelongestwordthatcannotbe
*brokenanyfurther.
*
*@paramparenttheparentcomposite
*@paramchanged<code>true</code>ifthecachedinformationshouldbe
*flushed,<code>false</code>otherwise.
*@returntheminimumwidthoftheparentcomposite
*/
publicintcomputeMinimumWidth(Compositeparent,booleanchanged);

/**
*Computesthemaximumwidthoftheparent.Allwidgetscapableofword
*wrappingshouldreturnthelengthoftheentiretextwithwrapping
*turnedoff.
*
*@paramparenttheparentcomposite
*@paramchanged<code>true</code>ifthecachedinformation
*shouldbeflushed,<code>false</code>otherwise.
*@returnthemaximumwidthoftheparentcomposite
*/
publicintcomputeMaximumWidth(Compositeparent,booleanchanged);
}

  TableWrapLayout自己完成了这个接口,如许让它处置当composites的layout是这个composite的parent的children的情形.别的的两个办法可以盘算两种极度情形--当一切组件尽量宽地充满时的明显的最小宽度和最年夜宽度.二者的分歧是使列之间的过剩空间尽量小时奉献出公允的空间.

  让我们看分明奉献空间是如何的.我们会保举我们到如今为止写的代码并象上面如许做出修正:
  1. layout.numColumns=3;Labellabel;TableWrapDatatd;label=toolkit.createLabel(form.getBody(),"Sometexttoputinthefirstcolumn",SWT.WRAP);label=toolkit.createLabel(form.getBody(),"Sometexttoputinthesecondcolumnandmakeitabit"+"longersothatwecanseewhathappenswithcolumn"+distribution.Thistextmustbethelongestsothatitcan"+"getmorespaceallocatedtothecolumnsitbelongsto.",SWT.WRAP);td=newTableWrapData();td.colspan=2;label.setLayoutData(td);label=toolkit.createLabel(form.getBody(),"Thistextwillspantworowsandshouldnotgrowthecolumn.",SWT.WRAP);td=newTableWrapData();td.rowspan=2;label.setLayoutData(td);label=toolkit.createLabel(form.getBody(),"Thistextgoesintocolumn2andconsumesonlyonecell",SWT.WRAP);label.setLayoutData(newTableWrapData(TableWrapData.FILL_GRAB));label=toolkit.createLabel(form.getBody(),"Thistextgoesintocolumn3andconsumesonlyonecelltoo",SWT.WRAP);label.setLayoutData(newTableWrapData(TableWrapData.FILL));label=toolkit.createLabel(form.getBody(),"Thistextgoesintocolumn2andconsumesonlyonecell",SWT.WRAP);label.setLayoutData(newTableWrapData(TableWrapData.FILL_GRAB));label=toolkit.createLabel(form.getBody(),"Thistextgoesintocolumn3andconsumesonlyonecelltoo",SWT.WRAP);label.setLayoutData(newTableWrapData(TableWrapData.FILL));form.getBody().setBackground(form.getBody().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
复制代码
  1.   这个创立了一些有分歧长度文本的label.有些labels占有多列,有些占有多行.为了让测试加倍复杂,我们把form的背景设置为组件背景,如许单位可以更复杂看出来.当我们运转例子,我们会失掉上面的模样:
复制代码
  1. 图片9:TableWrapLayout留下的过剩空间
复制代码
  关头的地方在于组件最小宽度和最年夜宽度比拟较时.相差越多,了局越分明,会看到列中有很年夜的漏洞.占有的宽度是组件所必要的最小的宽度.注重第3列比第2列略微宽一点点,这是由于第3列中的笔墨长度比第2列中笔墨要长点.假如必要浏览结构的相干实际,能够往这里W3CrecommendationsforHTMLtableauto-layout.

  ColumnLayout

  EclipseForms别的一个定制的layout是SWTRowLayout的变种.假如我们把RowLayout上的children垂直安排时--按列-而且使同列中的一切组件具有不异的宽度,我们会由组件的宽度失掉多个列.可是,最初一列明显不是被填满的--这由组件的个数决意.假如在form中,我们会仍旧看到一切组件在一列中,由于RowLayout不克不及够"垂直"包裹.假如我们用GridLayout相替换的话,列的数目由我们本人决意.

  在加倍庞大的forms中我们必要列的数目按情形变更.换句话来讲,我们但愿数字依照form的宽度来改动--有大概必要更多的列,当宽度减小时则把数字减小.并且我们但愿一切列的长度象报纸结构一样不异.这些请求都可以经由过程ColumnLayout来到达.

  与TableWrapLayout比拟,ColumnLayout加倍复杂.不必要庞大的设置.独一必要你设置的就是列数的局限,默许是1到3.上面的例子演示了一个利用ColumnLayout的有很多段落(sections)的form.初始时,只必要两列就能够安排一切段落了.假如我们把编纂器变窄一点,layout会使它们在统一列中.





图片10:利用ColumnLayout的一切按列分列的段落.layout入手下手是两列,可是依照空间的改动酿成了一列.
认真的记,感觉很紧张根本就没有时间和能力,来对技术知识点进行思考。这样课下就只能对知识进行简单的理解,其实简单的理解就是记忆课堂上讲的知识点,
老尸 该用户已被删除
沙发
发表于 2015-1-20 17:27:11 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
小妖女 该用户已被删除
板凳
发表于 2015-1-29 13:22:07 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
灵魂腐蚀 该用户已被删除
地板
发表于 2015-1-30 11:22:22 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
变相怪杰 该用户已被删除
5#
发表于 2015-2-2 20:47:09 | 只看该作者
是一种突破用户端机器环境和CPU
再现理想 该用户已被删除
6#
发表于 2015-2-3 12:35:52 来自手机 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
蒙在股里 该用户已被删除
7#
发表于 2015-2-22 22:18:47 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
精灵巫婆 该用户已被删除
8#
发表于 2015-3-7 03:21:00 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
小魔女 该用户已被删除
9#
发表于 2015-3-11 08:27:41 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
若相依 该用户已被删除
10#
发表于 2015-3-12 23:30:15 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
因胸联盟 该用户已被删除
11#
发表于 2015-3-13 00:08:39 | 只看该作者
是一种使用者不需花费很多时间学习的语言
山那边是海 该用户已被删除
12#
发表于 2015-3-20 06:44:15 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 05:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表