1、第7章 SWT控件详解,上一章学习了如何用SWT小部件制作GUI界面,这一章则详细讲解一些主要部件的使用。SWT的部件非常丰富,要在有限的篇幅中详细讲解每一个部件是非常困难的。而且Eclipse的帮助系统提供了详细的部件API参考手册,所以本书也尽量不重复参考手册中的内容,而是通过一些在开发中经常遇到的应用实例,对常用的部件进行讲解。另外,SWT中,很多部件的使用都是大同小异的,学习过一些常用的部件,其他部件也很容易理解。,7.1 用Composite制作可重用部件,在SWT的Java Doc中,对Composite的介绍非常简单:“Composite的实例是一个可以用来容纳其他控件的控件。”
2、在实际应用中,Composite的用途可不是一句话这么简单。在实际应用中,Composite非常重要,可以用来建造新的、可重用的部件。,7.1.1 部件重用的原理,Composite 可以作为一个基本的容器,把一组界面封装起来,做成Bean,可以实现界面的重用。例如同样一个界面,通过Composite封装后,就可以当作一个新部件,可以应用在窗口中、也可以应用到对话框中、或者应用到向导中,如果是制作Eclipse的插件,还可以放置到视图中。,7.1.2 重载新的Composite,下面按照这种思想建立一个可重用的部件。按照下面的代码建立一个类Composite001,这个类继承Composite
3、。,7.1.3 可重用账号密码部件的设计,现在这个Composite001里面还只是一个空白的部件,什么输入功能都没有。下面要把它变成一个账号密码部件。,7.1.4 初始化Composite的子部件,先按照下面代码修改initialize()方法。在这个方法中按照前面图7-3的设置添加了多个部件:三个显示输入框名称的Label,两个显示提示信息的Label,三个文本输入框Text。,7.2 GridLayout详解,GridLayout,顾名思义,就是网格布局。在一个容易上划分多行多列,部件放置到指定的单元格中,从而实现整齐的布局。GridLayout是SWT中使用频率最高的布局模式,相对与其
4、他Layout对象,使用起来复杂一点。下面就来详细学习一下如何使用GridLayout。,7.2.1 GridLayout的布局方式,在前面7.1.4小节的示例中,已经用GridLayout建立了布局。正如initialize()方法的前两行代码,初始化了一个GridLayout。GridLayout gridLayout = new GridLayout();GridLayout.numColumns = 3;,7.2.2 设置GridLayout的属性,GridLayout还有其他属性,对布局作更多的设置。常用的属性有:marginHeight、marginWidth、horizontal
5、Spacing、verticalSpacing。marginHeight: marginWidth: horizontalSpacing:verticalSpacing:,7.2.2 设置GridLayout的属性,7.2.3 单元格和GridData,GridData告诉GridLayout,对应的部件如何放置到GridLayout的单元格中。下面是GridData的常用属性,图7-6说明了这些属性的对应设置的用途。grabExcessHorizontalSpace: grabExcessVerticalSpace: horizontalAlignment: horizontalIndent
6、: horizontalSpan: verticalAlignment: verticalIndent: verticalSpan: heightHint: widthHint:,7.3 Text单行文本输入框,按照上面的代码,把一个Composite部件布局好。虽然这个界面部件就可以使用了,但是要满足实际应用,还需要加上更多的交互功能。例如用户账号有效性的验证,按照设计,用户账号只能是英文大小写字母和数字、下划线的组合。还有密码输入框的掩饰显示,不能让密码直接显示出来。要实现这些功能,就要对 Text部件进行更多的处理。,7.3.1 密码输入框,普通文本输入框变成密码输入框很简单。首先在初始
7、化的时候加入SWT.PASSWORD样式;然后,用setEchoChar()属性设置密码掩饰符。如下面代码那样,给password和passcheck加上密码掩饰符,同时设置密码长度不能超过16个字符。password = new Text(this, SWT.BORDER | SWT.PASSWORD);password.setEchoChar(*);password.setTextLimit(16);passcheck = new Text(this, SWT.BORDER | SWT.PASSWORD);passcheck.setEchoChar(*);passcheck.setText
8、Limit(16);,7.3.2 监听输入框中内容的修改,一旦应用了SWT.PASSWORD样式,Text文本框就只能输入英文字符集内的字符了。但是密码不能少于6位,密码少于6位,就要在旁边提示信息中显示错误警告。要实现这个功能,首先给密码输入框添加一个ModifyListener(修改监听器)。,7.3.3 限制输入字符,用户账号,限制只能输入英文和数字,包括下划线或者减号。要实现这个功能,就要使用VerifyListener。Verify事件是控件获得用户输入之后,在保存用户输入的文本内容前触发的事件。看上去好像和Modify事件差不多,都是在用户输入之后。Verify在Modify事件之
9、前。,7.4 Label的用途,Label也是个使用非常频繁的部件,在界面上需要用它来显示一些文字信息,例如最常用的就是说明界面上某个输入字段的名称。在SWT中,Label的用途还有很多。例如作为GridLayout中的占位部件,还可以用作分隔线。,7.4.1 简单标签,最简单的标签就是显示文本信息,构造的时候不需要设置任何样式和属性。样式参数给一个SWT.NONE参数就可以了。然后用setText方法设置显示的文本。SWT的Label不会根据字符的变化自动伸展。,7.4.2 Label和CLabel,在这个例子中,还可以看到另外一个标签部件CLabel。Label有一个缺陷,虽然具有setI
10、mage(Image image)这个方法,可以在标签上显示图标,但是一旦设置图标,就不能同时显示文字信息了。另外一个部件CLabel就解决了这个问题,可以同时显示图标和文字信息。,7.4.3 设置字体的颜色,设置字体的颜色用 setForeground(Color color)方法,设置背景颜色用setBackground(Color color)方法。在前面介绍SWT部件的继承关系时候,可以看到,Label等等部件都是继承自Control的,而setForeground和 setBackground都是Control中就实现的方法,所以所有继承自Control的部件都有这两个方法设置字体的
11、颜色和背景颜色。颜色的定义用的是Color对象。在后面关于SWT绘图的内容中会详细说明Color的使用。一般的应用可以不需要自己构造Color对象。在SWT中,已经预先定义了一批系统颜色。正如在例子中那样。用Display.getCurrent().getSystemColor(int color)这个静态方法就可以获得预定义的Color对象。getSystemColor的参数来自SWT中预定义的常量:COLOR_BLACK、。参考手册,7.4.4 标签的妙用,在这个例子中,还看到标签的另外一种用法,就是把标签部件当作分隔线使用。要把标签变成分隔线只要构造的时候赋予 SWT.SEPARATOR
12、样式、以及分隔线的类型。例如:new Label(this, SWT.SEPARATOR | SWT.HORIZONTAL); /这是横向分隔线;new Label(this, SWT.SEPARATOR | SWT.VERTICAL); /这是竖线。,7.5 Group的应用,下面再继续制作一个部件,这是一个输入员工资料的输入面板。在这个输入面板上,布满大量的输入字段,除了简单的文本输入框,还有单选框(Radio Button),下拉列表(Combo)。为了更好地组织这些输入字段,使用了Group部件来进行分组。通过制作这个部件,将会接触到几个新的SWT部件。包括Group、Radio Bu
13、tton。首先来学习一下Group的应用。,7.5.1 添加Group,首先依然还是像前面的例子那样,先重载一个Composite。建立一些基本的方法,包括initlize()。根据需要还可以加上main()方法。main()方法复制上一个例子的就可以了。在这个例子中,将建立一个输入个人基本信息的编辑面板。面板左边是个人资料,包括姓名、性别、生日、身份证和学历。右边是关于工作的基本信息,包括工号、入职时间、职位、部门等等。,7.5.2 在Group上添加子部件,在Group添加子部件需要做两步,第一步是设置Group部件的布局方式,第二步是在构造子部件时,把Group部件作为parent参数。
14、,7.6 Button和Text的其他用法,在这个例子中,还出现了几个新的部件Radio Button和TextArea、Spinner。其实Radio和TextArea都不是新的部件,Radio Button是Button的另外一种形态,TextArea是Text的另外一种形态。下面详细学习一下,如何通过设置Button好Text的样式来建立这些“变种”的部件。,7.6.1 Button的样式,要把Button作为Radio使用,只要在构造的时候设定style参数为SWT.RADIO就可以了。Button还可以作为其他几种部件来使用。ARROW: CHECK: PUSH: RADIO: TO
15、GGLE:,7.6.2 Button作为Radio使用,作为Radio使用时,因为Radio也叫单选按钮,在一个容器部件中,如果出现多个Radio,那么永远只有一个处于选择状态。要判断那个处于选择状态,就要进行判断。例如在前面的例子中,要获得性别的选择,可以类似下面写一个获得性别选项的方法:public boolean getGender()if(radioMale.getSelection() /获得单选框的选择状态,进行判断,如果被选择,则返回truereturn true;if(radioFemale.getSelection()return false;return true;,7.6
16、.3 Button作为检查框CheckBox,下面是Button作为检查框的简单例子。只要将Button对象设置为SWT.CHECK属性就可以了。setText则是设置检查框右边显示的文本内容。checkBox = new Button(this, SWT.CHECK); / 建立检查框checkBox.setText(Check box); /设置检查框的文本标签判断检查框的勾选状态用也是用getSelection()方法,被勾选,返回true,没有被勾选,返回false。设置选择状态则是用setSelection()方法。,7.6.4 Button作为箭头按钮,把Button用作箭头按钮时
17、,除了要设置SWT.ARROW样式外,还要同时组合使用SWT.CENTER、SWT.DOWN 、SWT.LEFT、SWT.RIGHT几个样式。这个几个样式分别代表不同方向的箭头。下面的代码演示了几种箭头按钮的应用。arrowUP = new Button(this, SWT.ARROW | SWT.CENTER);Button(this, SWT.ARROW | SWT.DOWN);arrowLeft = new Button(this, SWT.ARROW | SWT.LEFT);arrowRight = new Button(this, SWT.ARROW | SWT.RIGHT);,7.
18、6.4 Text作为TextArea使用,在用户界面中,还有一个常用的部件就是多行文本输入框,通常称为TextArea。在其他一些UI系统中,TextArea可能是单独一种不见,而在Eclipse中,则是通过Text来实现,只要在构造Text的时候,添加SWT.MULTI样式,就是一个TextArea多行文本输入框了。,7.7 TabFolder的应用,选项卡也是常用的用户界面。如果一个界面中有大量输入字段,最好的方法就是把这些输入字段进行分类,分成多个选项卡显示。在Eclipse中,用于建立选项卡的部件是TabFolder。单独依靠TabFolder还不能实现选项卡的功能,还需要TabIte
19、m的配合。下面就来学习使用TabFolder好TabItem建立选项卡。,7.7.1 建立TabFolder,在这个例子中,要把前面制作的一系列Composite部件,通过TabFolder组合成一个编辑个人资料的编辑面板。,7.7.3 TabFolder的应用步骤,在这个例子中,initTabs()方法负责建立选项卡。TabFolder的应用过程大概可以分成下面几步:第一步:建立TabFolder部件对象。tabFolder = new TabFolder(this, SWT.NONE);第二步:建立TabItem。第三步:以TabFolder作为parent参数建立每一页的部件。第四步:调
20、用TabItem的setControl方法(),把第三步建立的子部件关联到对应的TabItem中。,7.7.4 TabItem的使用,从例子中也可以看到,建立选项卡部件的关键是TabItem的使用。TabItem有下面几个关键的方法:public void setControl(Control control)public void setImage(Image image)public void setText(String string)public void setToolTipText(String string),7.7.5 在底端显示活页标签,默认情况下,活页的标签是显示在上方的。
21、只要在构建TabFolder的时候,添加SWT. BOTTOM样式,就可以让标签显示在下方。,7.8 菜单和工具栏,前面建立的都是一些输入部件,这些部件只能作为应用程序中的一部分来使用。要建立一个真正的GUI应用程序,还需要建立一个应用程序窗口。在这个应用程序窗口中,需要有菜单和工具栏。下面就来学习一下SWT是如何实现菜单和工具栏的。,7.8.1 建立包含菜单和工具栏的程序,在窗口中建立菜单栏的过程有点繁琐。在这个例子中,将建立一个浏览器程序,程序的中间是一个浏览器部件Browser,上面是菜单和工具栏。,7.8.2 建立菜单栏,现在这段代码只是编写了一个框架,createMenu()和cre
22、ateToolBar()都还没有实现。先来实现菜单。要建立菜单,需要使用Menu和MenuItem。建立菜单栏大概分成下面几个步骤:第一步,新建一个Menu对象,设置为shell的menubar,这个Menu对象就成为窗口的菜单栏了;第二步,为这个菜单栏添加多个MenuItem,这些MenuItem就是菜单栏上的各个子菜单;第三步,分别以这些MenuItem为parent参数,建立Menu对象,并用MenuItem的setMenu()方法建立关联;第四步,分别为每个MenuItem中的Menu对象添加菜单命令,每个菜单命令是一个MenuItem对象。如果需要建立子菜单,重复上面第二步开始的过程
23、。,7.8.3 Menu和MenuItem的样式,Menu和MenuItem各自都有多种样式,例如在上面建立菜单栏的时候,要把Menu设置为菜单栏,样式就是BAR,下面是Menu的样式:BAR : DROP_DOWN: POP_UP: NO_RADIO_GROUPMenuItem的样式:CHECK: CASCADE: PUSH, RADIO: SEPARATOR:,7.8.4 建立工具栏,工具栏相对来说就简单一些,用Toolbar和ToolItem。建立了Toolbar后,以这个Toolbar对象作为parent参数,建立ToolItem。每个ToolItem对应工具栏上的一个按钮或者其他控件
24、。,7.8.5 Toolbar和ToolItem的样式,FLAT: WRAP: RIGHT: HORIZONTAL: VERTICAL: SHADOW_OUT: ToolItem的样式PUSH: CHECK: RADIO: SEPARATOR: DROP_DOWN:,7.8.6 响应菜单、工具栏的事件,响应菜单、工具栏的命令,实际上就是添加Selection事件。,7.9 小结,本章学习了SWT主要部件的应用,包括有:Composite、Text、Button、Spinner、Combo、Menu、Toolbar、Browser、Group、Tabfolder等等。使用Composite作为容器,可以组装成新的部见。在应用程序中,可以使用这些新的部件组装成各种界面应用。在SWT中,最常用的布局对象是GridLayout,灵活使用GridLayout可以实现整齐美观的界面布局。本章还学习了事件的应用,像按钮和菜单的响应,都是通过添加SelectionListener来实现。还学习了通过ModifyListener来监听部件内容的变化,通过VerifyListener来验证用户键盘输入的内容。最后菜单和工具栏的应用示例中,还建立一个简单的窗口应用程序,演示了建立GUI应用程序的基本过程。,