




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章SWT用户界面计算机科学与技术教研室龚平本章主要内容SWT简介MVC模式与SWTSWT布局管理器SWT文本输入选择组件SWT菜单SWT对话框(Dialog类)2和其它语言一样,Java也具有开发图形用户界面的功能。图形用户界面(GraphicalUserInterface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。6.1SWT简介早期的Java版本(JDK1.0和JDK1.1)采用的是AWT组件。AWT(AbstractWindowToolkit),最原始的JavaGUI工具包。利用AWT编写图形用户界面时,实际上是在利用本地操作系统所提供的图形库。一个AWT应用可能在Windows上表现很好可是到了Macintosh上几乎不能使用,或者正好相反。(违背了Java“writeonce,runanywhere”的信条)AWT作为Java最弱的组件受到不小的批评。6.1.1AWT、Swing与SWT在JDK1.2版中,图形用户界面功能被大幅度地扩展,形成了称为Java基础类库(JavaFoundationClasses,JFC)的一整套API集合,主要包括以下5个部分:抽象窗口工具;Swing图形界面类库;支持二维图形的类库(Java2D);支持拖放的类库(DragandDrop);支持易用性的类库(Accessibility)
5Swing这些组件全都是用Java语言编写的,可运行在任一支持JVM的平台上,并且在不同的平台上其表现是一致的。Swing是在AWT组件基础上构建的,而且提供了许多新的图形用户界面组件,因此它所提供的功能要比AWT的更广泛、更强大。Swing组件没有本地代码,不依赖于具体的本机操作系统的支持,并且还有能力提供本地系统不支持的其它特性,这是它与AWT组件的最大区别。Swing也是Java技术的一种标准配置。SWT:TheStandardWidgetToolkitSWT是IBM公司推出的,其最大优点是运行速度快,能够获得与操作系统的内部应用程序相同的外观。官方API文档/swt/javadoc.php6.1.1AWT、Swing与SWTSWT使用操作系统提供的Widgets来渲染其图形应用程序,在Control类中的对象在操作系统中有一个直接的对应物,可以通过类的句柄使用它。然而在Control类之外,SWT还提供了不少的组件。具体的层次结构如下图所示。补充:三者的特性比较6.1.2SWT程序开发步骤了解一下如何利用Eclipse进行一个SWT程序的开发,它由以下4步组成:新建Java工程项目:HelloLabel;设置项目的建构路径,右键单击项目名,BuildPath->ConfigureBuildPath,单击AddExternalJARs;定位到eclipse\plugins中org.eclipse.swt.win32.win32.x86_3.100.1.v4236b.jar和org.eclipse.swt_3.100.1.v4236b.jar,单击“打开”按钮;新建一个类HelloLabel(代码清单6-1)。
操作演示:利用MyEclipse进行SWT开发。6.1.3SWT中的包SWT中常用的包:org.eclipse.swt.widgets
org.eclipse.swt.layout
org.eclipse.swt.custom
org.eclipse.swt.event
org.eclipse.swt.graphics
org.eclipse.swt.ole.win32
6.2MVC模式与SWTMVC(Model-View-Controller)是软件开发过程中比较流行的设计思想。在了解MVC之前,首先要明确一点,MVC是一种设计模式(设计思想),不是一种编程技术。MVC是一种交互界面的结构组织模型。MVC由TrygveReenskaug提出,首先被应用在SmallTalk-80环境中,是许多交互和界面系统的构成基础,Microsoft的MFC基础类也遵循了MVC的思想。讨论如下的一个场景:要做一个计算机等级考试成绩查询系统,输入准考证号就可以显示这个考生的成绩。如何实现?有一种很容易想到的方案:写一个程序,接受用户输入并验证,同样是这个程序,在数据库中提取数据后显示考试成绩。但是,软件需求可能是变化的。在系统投入使用后,可能会出现下列的情况:1.考试中心决定,成绩的显示应该更美观一些,要改变显示方式。2.在验证信息时要多一些内容,比如验证身份证号等等。3.数据库“升级”了,数据库变成了不同的名字,表结构也变了,查询时需要修改代码。如果使用前面提到的方案,要解决这些问题,就必须把程序的某一部分改掉。但是,最忌讳的就是在很长的一段程序中修改很小的一部分,这样做代价很高,并且在开发过程中分工也很不方便。如:UI人员修改显示方法时,需要面对大量数据库访问的代码。基于这个问题,可以把程序拆成三个模块来做。界面模块(View),负责输入查询的准考证号,提交到验证模块(Control),访问数据库,将提取的数据(成绩和准考证号)封装到模型(Model)中,再显示到界面。适合分工、维护方便对于界面设计可变性的需求,MVC把交互系统的组成分解成模型、视图、控制三种组件。6.2MVC模式与SWT现在结合JavaSWT来说明MVC设计模式:模型(Model):是存储SWT组件数据的地方,例如Table的Model会存储表格上的所有数据。负责维护数据。模型通常提供访问和修改数据的方法。当模型变化时,这个模型还把事件发送给已登记的视图,对此,视图根据模型的变化来更新自己。视图(View):指SWT组件的外观显示效果。负责提供模型的部分数据的可视图。
控制器(Controller):响应用户在SWT组件上的具体操作,为视图处理事件。鼠标和动作监听器等Swing监听器都是MVC控制器。
6.3SWT布局管理器容器构建在容器类中,容器构建在主窗体(Shell)中,主窗体也是容器。容器不仅可以容纳组件,也可以容纳容器。容器内的组件,如何排序?如何调整组件的大小、位置?……由“布局管理器”负责。SWT提供了许多常用的布局管理器,其中org.eclipse.swt.layout包中四种布局管理器:FillLayout、RowLayout、GridLayout和FormLayout。FillLayout:充满式布局,在容器中以相同的大小以单行或单列排列组件。RowLayout:行列式布局,以单行或多行的方式定制组件的排列方式。GridLayout:网格式布局,以网格的方式进行布局,组件可以占用指定的一个或几个网格。FormLayout:表格式布局,通过定义组件四个边的距离来排列组件,被引用的相对的组件可以是父组件,也可以是同一容器中的其它组件。6.3.1充满式布局充满式布局(FillLayout类)是最简单的布局管理器。它把组件按一行或一列充满整个容器,并强制组件的大小一致。一般,组件的高度与最高组件相同,宽度与最宽组件相同。FillLayoutdoesnotwrap,butyoucanspecifymarginsandspacing。如果容器中只有一个组件,则该组件会充满整个容器。构造方法:FillLayout():创建按一行充满容器的对象。FillLayout(inttype):创建按指定类型充满容器的对象,指定类型(type)有:SWT.HORIZONTAL:按一行充满容器。SWT.VERTICAL:按一列充满容器。代码清单6-2DisplayInstancesofthisclassareresponsibleformanagingtheconnectionbetweenSWTandtheunderlyingoperatingsystem.获得一个Display的对象:Display类提供了如下常用做法:publicstatic
Display
getDefault()常用构造方法public
Display()Shell相当于应用程序的主窗体。构造方法:public
Shell()public
Shell(Display
display)public
Shell(Display
display,int
style)public
Shell(int
style)public
Shell(Shell
parent)public
Shell(Shell
parent,int
style)通过案例6-2,可以看出SWT程序的步骤:
1.创建一个Display对象。Display对象是SWT和操作系统通信的桥梁。2.创建一个或者多个Shell对象。Shell代表了程序的窗口。3.在Shell内创建各种部件(widget),如按钮、下拉框和列表等。4.对各个部件进行初始化(外观、状态等),同时为各种部件的事件创建监听器(listener)。监听器可以监听窗口的消息。(此案例没有添加监听器,将会在第7章重点学习监听器。)5.调用Shell对象的open()方法以显示窗体。6.对各种事件进行监听并处理,直到程序发出退出消息。7.调用Display对象的dispose()方法以结束程序。6.3.2行列式布局行列式布局(RowLayout类)可以使组件折行显示,可以设置边界距离和间距。另外,还可以对每个组件通过setLayoutData()方法设置RowData对象。RowData用来设置组件的大小(widthandheight)
。6.3.2行列式布局1)构造方法:RowLayout()创建按行放置组件的对象。RowLayout(inttype)创建按指定类型放置组件的对象。指定类型(type)有:SWT.VERTICAL按列放置组件。SWT.HORIZONTAL按行放置组件。6.3.2行列式布局2)常用属性:intmarginWidth:
marginWidthspecifiesthenumberofpixelsofhorizontalmarginthatwillbeplacedalongtheleftandrightedgesofthelayout.TmarginHeight:组件距容器上、下边缘的高度(像素),默认值为0。intmarginTop:组件距容器上边缘的距离(像素),默认值为3。intmarginBottom:intmarginLeft:intmarginRight:intspacing:组件之间的距离,默认值为3。6.3.2行列式布局booleanjustify:如果该属性为true,则组件间的距离随容器的拉伸而变大。默认值为false。booleanwrap:如果该属性为true,则当容器空间不足时会自动折行;如果该属性为false,不自动折行。默认值为true。booleanpack:如果该属性为true,组件大小为设定值;如果该属性为false,则强制组件的大小相同。默认值为type:使组件按指定式样放置,(type=SWT.HORIZONTAL|SWT.VERTICAL),默认为按行放置,默认值为SWT.HORIZONTAL。6.3.2行列式布局3)RowData类:RowData称为RowLayout的布局数据类,可用于改变容器中组件的外观形状。其构造方法:public
RowData()RowData(intwidth,intheight)public
RowData(Point
point)例如:Buttonbt1=newButton(shell,SWT.PUSH);//创建按钮bt1.setText("按钮1");RowDatarowdata=newRowData(60,30);//创建布局数据类的对象bt1.setLayoutData(rowdata);//设置按钮的布局数据代码清单6-36.3.3网格式布局网格式布局(GridLayout类)是实用而且功能强大的标准布局,也是较为复杂的一种布局。这种布局把容器分成网格,把组件放置在网格中。GridLayout专用的布局数据类是GridData。GridLayout的强大之处在于它可以通过GridData来设置每一个组件的外观形状。GridLayout的构造方法:public
GridLayout()public
GridLayout(int
numColumns,boolean
makeColumnsEqualWidth)1)GridLayout的属性intnumColumns:设置容器的列数,组件从左到右按列放置,当组件数大于列数时,下一个组件将自动添加新的一行。默认值为1列。booleanmakeColumnsEqualWidth:强制使列都具有相同的宽度,默认值为marginWidth:默认值为5marginHeight:intmarginLeft、marginTop、marginRight、marginBottom:默认值0inthorizontalSpacing:设置列与列之间的间隔,默认值为5。intverticalSpacing:设置行与行之间的间隔,默认值为5。代码清单6-42)GridData类GridDataisthelayoutdataobjectassociatedwithGridLayout.GridData常用的构造方法如下:GridData():创建一个属性值为默认值的对象。GridData(inttype):创建一个指定类型(type)的对象。GridData常用类型如下:GridData.FILL:通常与GridData类的对象属性horizontalAlignment和verticalAlignment配合使用,充满对象属性指定的空间。GridData.FILL_HORIZONTAL水平充满,组件充满网格水平方向的空间。GridData.FILL_VERTICAL垂直充满,组件充满网格垂直方向的空间。GridData.FILL_BOTH双向充满,组件充满水平和垂直方向的空间。GridData.HORIZONTAL_ALIGN_BEGINNING水平对齐靠左,组件在网格中靠左放置。GridData.HORIZONTAL_ALIGN_CENTER水平对齐居中,组件在网格中居中放置。GridData.HORIZONTAL_ALIGN_END水平对齐靠右,组件在网格中靠右放置。GridData常用对象属性如下:inthorizontalSpan设置组件占用的列数,默认值为1。intverticalSpan设置组件占用的行数,默认值为1。booleangrabExcessHorizontalSpace抢占额外的水平空间。booleangrabExcessVerticalSpace抢占额外的垂直空间。inthorizontalAlignment设置组件的对齐方式为水平方向。intverticalAlignment设置组件的对齐方式为垂直方向。代码清单6-56.3.4表格式布局表格式布局(FormLayout类)是一种非常灵活、精确的布局方式,这个布局是SWT2.0版新增的。FormLayout也有专用的布局数据类FormData,此外,还增加了一个FormAttachment类。FormAttachment定义了组件的四边与父容器(Shell、Composite等)的边距,为保证组件在父容器中的相对位置不变,FormAttachment类用不同的构造方法来实现组件的定位,用FormData和FormAttachment配合,可以创建复杂的界面,而且当主窗体大小改变时,组件的相对位置能保持相对不变。6.3.4表格式布局构造方法:public
FormLayout()1)FormLayout的常用属性intmarginWidth:设置组件与容器边缘的水平距离,默认值为0。intmarginHeight:设置组件与容器边缘的垂直距离,默认值为0。例如,以下代码把父容器(shell)的四周边距都设置成10像素:Displaydisplay=newDisplay();Shellshell=newShell(display);FormLayoutformlayout=newFormLayout();formlayout.marginHeight=10;formlayout.marginWidth=10;shell.setLayout(formlayout);6.3.4表格式布局2)FormData类FormData的构造方法FormData的属性6.3.4表格式布局3)FormAttachment类Attachment的含义是附着、粘贴。FormAttachment类就是用来指定组件在父容器中的粘贴位置。FormAttachment计算组件粘贴位置和组件大小的方法是依据下面的表达式:y=ax+b,表达式中y是纵坐标,从上往下是正方向;x是横坐标,从左至右是正方向;a是斜率(a=m/n,n≠0),b是偏移量,沿x、y轴正方向的偏移量为正,反之为负。代码清单6-66.4SWT文本输入文本输入组件主要包括标签(Label类)组件和文本框组件(Text类)。标签(Label类)可以让用户输入文字提示信息。文本框(Text)具有用户输入和编辑文本功能。文本框组件可以作为单行的编辑框,让用户可以输入或查看一组信息(由文本框可容纳的字符数所指定);或多行的编辑框,让用户可以输入或查看可换行的自由文本。文本框组件也可以有多种边框,让用户可以开发出想要在用户界面中展示的外观与操作感受。6.4.1标签(Label类)继承关系:构造方法:Label(Compositeparent,intstyle)Label类的常用式样style有以下几种:SWT.CENTER:文字居中。SWT.RIGHT:文字靠右。SWT.LEFT:文字靠左。SWT.NONE:默认式样。SWT.WRAP:自动换行。SWT.BORDER:深陷型。SWT.SEPARATOR:分栏符,默认为竖线分栏。SWT.HORIZONTAL:横线分栏符。代码清单6-7文本框(Text类)继承关系:构造方法:Text(Composite
parent,int
style)6.4.2文本框组件文本框(Text类)的式样style:SWT.NONE:默认式样。SWT.CENTER:文字居中。SWT.LEFT:文字靠左。SWT.RIGHT:文字靠右。SWT.MULTI:可以输入多行,须回车换行。SWT.WRAP:可以输入多行,到行尾后自动换行。SWT.PASSWORD:密码型,输入字符显示成“*”。SWT.BORDER:深陷型。SWT.V_SCROLL:带垂直滚动条。SWT.H_SCROLL:带水平滚动条。代码清单6-86.5选择组件很多情况下,我们可能会给用户几种选择,而不需要用户在文本组件中输入数据。SWT提供了按钮组件(Button类)、列表框组件(List类)和下拉框组件(Combo类)让我们实现这样的功能。6.5.1按钮组件(Button)按钮(Button)组件是SWT中最常用的组件。按钮有很多样式,最常见的Button样式是pushbutton、radiobutton、checboxbutton。pushbutton能让用户将它按下—开始一些动作。Yes、No与Cancel这几个经常在消息对话框上看到的Button是这一类型的代表。radiobutton是被组织过的一组Button,且它们在任何时候只有其中一种能够被选中。checkbox是单一或者一组按钮,且它们在任何时候可以被选择多个。Button类的继承关系:构造方法:Button(Composite
parent,int
style)代码清单6-9、6-10、6-116.5.2列表框组件(List类)如果有多个选择,使用按钮组件就不太适宜了,因为使用按钮会占据很大的屏幕空间。这时我们可以使用列表框组件(List类),列表框组件(List类)是用来展示信息给用户并允许选取一个或多个项目以供采取后续动作(如按下按钮来开始处理)。 List类的继承关系:构造方法:List(Composite
parent,int
style)1)列表框(List类)的式样SWT.NONE:默认式样。SWT.V_SCROLL:带垂直滚动条。SWT.MULTI:允许复选。SWT.SINGLE:允许单选。2)List类常用方法voidadd(Stringstring):在List中增加一项。voidadd(Stringstring,intindex):在List的第index项后插入一项。voiddeselectAll():使List组件中的当前选择项置空。voiddeselect(int
index)voidremove(intindex):将List的第index+1项移除。voidremoveAll():将List中的所有选项清空。voidsetItems(String[]items):将数组中的各项依次加入到List中。voidselect(intindex):将List的第index+1项设置为当前选择项。String[]getSelection():返回一个所有选项。booleanisSelected(int
index)
etc.代码清单6-126.5.2列表框组件(List类)3)添加项目到List中:
void
setItem(int
index,String
string)可以使用setItem(…)这个方法将项目加入到List中。这种方法让程序代码简洁且清晰。例如:Stringitems[]={"C++","JAVA","C"};list.setItems(items);当然,我们还可以使用add()方法将项目加入到List中:list.add("C++");list.add("JAVA");list.add("C");6.5.2列表框组件(List类)4)从List中移除具体项目:publicvoid
remove(int
index)public
void
remove(int[]
indices)public
void
remove(int
start,int
end)public
void
remove(String
string)6.5.3下拉框组件(Combo类)下拉框组件(Combo类)是用来让用户从一组项目选择或是输入不在项目中的文字来收集信息。它结合了List与Text这两个组件的功能,因此叫做Combo。在List和Combo之间做选择是很简单的:在要让用户能够看到全部或部分的选项是很重要的时候,或在占据屏幕面积的大小不重要的时候,可以使用List。Combo类的继承关系:构造方法:Combo(Composite
parent,int
style)1)下拉框(Combo类)的式样SWT.NONE:默认式样。SWT.READ_ONLY:只读。SWT.SIMPLE:无须单击下拉框,列表会一直显示。2)下拉框(Combo类)的常用方法voidadd(Stringstring):在Combo中增加一项。voidadd(Stringstring,intindex):在Combo的第index项后插入一项。voiddeselectAll():使Combo组件中的当前选择项置空。voidremove(intindex):将Combo的第index+1项移除。voidremoveAll():将Combo中的所有选项清空。voidsetItems(String[]items):将数组中的各项依次加入到Combo中。voidselect(intindex):将Combo的第index+1项设置为当前选择项。代码清单6-136.6SWT菜单菜单(Menu类,MenuItem类)是常用的SWT组件,Menu是一个菜单栏,同时也是一个容器,可以容纳菜单项(MenuItem)。Menu类的继承关系:常用的构造方法:public
Menu(Control
parent)publicMenu(Decorations
parent,int
style)1)Menu的式样:SWT.BAR:菜单栏,用于主菜单。SWT.DROP_DOWN:下拉菜单,用于子菜单。SWT.POP_UP:鼠标右键弹出式菜单。MenuItem类的继承关系:构造方法:public
MenuItem(Menu
parent,int
style)public
MenuItem(Menu
parent,int
style,int
index)2)MenuItem的式样SWT.CASCADE:有子菜单的菜单项。SWT.CHECK:选中后前面显示一个小勾。SWT.PUSH:普通型菜单。SWT.RADIO:选中后前面显示一个圆点。SWT.SEPARATOR:分隔符。3)建立菜单的一般步骤:首先建立一个菜单栏,需要使用SWT.BAR属性。MenumainMenu=newMenu(shell,SWT.BAR);窗体中指定需要显示的菜单栏。shell.setMenuBar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五年级语文学习困难生提升计划
- 九年级复习计划家长沟通指南
- 2025年高模量玻璃纤维纱项目发展计划
- 六年级语文上册习作创意写作训练
- 六年级科学跨学科教学计划
- 聚丙烯电容膜材料的研究进展与应用前景分析
- 2025年数字压力检测仪器项目发展计划
- 某公司2025年员工培训与发展计划
- 统编版六年级语文下册第25课《掌声》
- 英语学习计划的制定与范文示例
- 基于PI3K-AKT通路探讨泽泻醇A改善脑微血管内皮细胞氧糖剥夺损伤的机制研究
- 金蝶云星空+V7.5-产品培训-供应链-销售管理
- 喷砂(抛丸)作业风险点告知卡
- 《文创灯具设计(论文)》
- 2023年浙江二造《建设工程计量与计价实务(土木建筑)》考试重点题库200题(含解析)
- 信管家风控实战
- 公路工程各主要试验检测项目
- 团队建设(破冰活动)精编版课件
- 岩石性质及其工程分级课件
- 化工仪表自动化-压力仪表培训课件
- 老年人泌尿系统疾病课件
评论
0/150
提交评论