赞
踩
最近复习了一下SWT的基本知识,也看了不少书上的例子,总体感觉东西不难,但是零碎的东西很多,不容易记住。比如说布局管理器知识,它是任何一个图形界面设计不可或缺的基础知识,因此,我也就详细的对这块做了一个整理,总结,还针对各个布局管理器做了个demo。
因此,我就写这篇博文,一来是对自己学过的知识重新梳理一下,做到温故而知新,二来是将重要的东西记录下来,留着以后查看。
首先了解一下SWT的基础知识。
1. 如何安装SWT
SWT开始流行始于Eclipse的流行,可以从Eclipse SWT官方首页(http://www.eclipse.org/swt/ )下载SWT包,如果使用swt集成开发环境,也可以直接在Eclipse的plugin的文件夹下面找到此包。
我下载的压缩包是swt-3.5.2-win32-win32-x86,在使用时将里面的swt.jar包加入到引用包里面就可以了。
2. 了解一下SWT中的几个重要的基础类
Display 类
Display 从 Device 类继承而来,同时继承自 Device 的还有 Printer 类。 Display 负责应用程序和本地操作系统之间建立交互,启动一个专有线程,该线程将执行事件循环并保持 UI 线程:所有对本地界面的部件的调用都是在该线程中完成。 其对象封装了对本地操作系统资源、事件和部件( widget )的管理, Display 类和 OS 类进行交互,而 OS 类中使用了大量的 JNI 方法与操作系统进行交互。
重要方法
Shell类
Shell类就是窗口,即Swing里面的JFrame,可以是顶级窗口(创建时传入的是Display对象),也可以是Secondary或者对话框窗口(创建是传入的是Shell对象)。
Shell的继承结构
常用方法
3. 接下来还需要了解一下SWT包的基本结构和作用,这对于SWT的整体把握有好处
SWT constants and error handling support. | |
Eclipse 已访问性包,专为残疾人设计 | |
提供在 SWT 中嵌入 AWT 程序的接口 | |
提供实现浏览器功能的部件 | |
提供一个自定义的部件(相对于本地部件而言) | |
SWT Drag and Drop support. | |
提供 SWT 事件监听器的支持 Event Listener 以及默认 Adapter 实现类和 Event 类 | |
SWT graphics classes. 如 Color , Font 和 Image 等 | |
FillLayout, GridLayout, RowLayout, 和 FormLayout | |
提供了 SWT 中 Win32 OLE 实现的一些类 | |
SWT OpenGL support. | |
支持打印机的类 | |
支持在 SWT 程序中使用其他应用程序打开文件 | |
最常用的 SWT 窗口小部件( widget )的公有 API 定义所在。如 Display , Shell,Button , Menu 等。 |
4. SWT的widget,Control概述
widget的外观是通过绘制显示出来的,通过绘制操作来维持部件的状态。当用户通过键盘和鼠标或者通过程序代码改编部件的状态,它们都会重绘以显示新状态,这是所有部件的重要特性。这相当于是部件的一个通用的属性域,并且不需要告诉部件该属性已经发生变化需要重绘,它会自动完成。比如,鼠标点击一下按钮,按钮就会按下去,松开鼠标,按钮就会弹出来,这就是自动绘制的。
Widget类是各种用户界面元素的整个继承体系的父类。不论是在org.eclipse.set.widgets包里面的还是以外的部件子类都是通过实现事件机制以及特定的API来扩展Widget的基本行为。每一个Widget不能没有父类部件而存在,并且Widget一旦创建后,其父类部件就只能是第一次指定的那个部件了,不能再改变。
Widget(部件)分成两大部分,第一部分就是所谓的Control(控件),这些控件是操作系统控件的抽象父类,Control为它们提供统一的用户接口。例如Button,Text,Shell,Composite等这些都是Control的子类。
另一块就是那些对于部件完整性以及用户的需求来说非常必要,但是操作系统却没有相应的类库支持的,这些控件的实现就需要SWT根据不同的操作系统,自己绘制出来。如TreeItem,Menu,Tracker等等。
下表给出了Widget和Control的关系,以及其他常用的一些Control和非Control的Widget。
Widget | Control | Label |
|
|
|
Sash |
|
|
| ||
ProgressBar |
|
|
| ||
Scale |
|
|
| ||
Scrollable |
|
|
| ||
Composite | Combo |
|
| ||
CoolBar |
|
| |||
ToolBar |
|
| |||
Group |
|
| |||
Table |
|
| |||
TabFolder |
|
| |||
Tree |
|
| |||
Canvas | Decorations | Shell | |||
List |
|
|
| ||
Button |
|
|
| ||
Sllder |
|
|
| ||
Text |
|
|
| ||
Caret |
|
|
|
| |
ScrollBar |
|
|
|
| |
Item |
|
|
|
| |
Menu |
|
|
|
| |
Drop Target |
|
|
|
| |
DragSource |
|
|
|
| |
Tracker |
|
|
|
|
5. SWT的面板容器类
这里重点理解一下选项卡文件夹(TabFolder)
一个选项卡文件夹由一个或多个选项卡(TabItem)组成,每个选项卡可以控制一个控件,并且一次只能显示一个选项卡。TabItem通过setControl(Control c)方法设置所控制的显示的控件。详见HelloWorld.java的createTabFolder()方法
在org.eclipse.swt.custom包中,自定义CTabFolder比TabFolder功能更加强大,CTabItem与之对应
带有关闭按钮(SWT.CLOSE)的选项卡,当点击关闭的时候,该CTabItem对象就销毁了,其控制的控件也销毁了。
接下来需要重点理解的就是SWT的布局管理器
布局管理器就是常说的托管定位,所有的置于面板容器内的widget都是由布局管理器,对于每一个控件布局管理器会在运行时计算其位置和大小,相对于绝对定位的最大好处有二,其一是代码的可读性强,维护方便;其二,由于布局管理器是动态的,当窗口改变时,widget的大小和位置会跟着改变。
FillLayout
最简单的是Filllayout,使用该布局管理器的容器试图将控件横向或者纵向一行铺满整个容器,一旦设定某个方向之后,所有的控件都是会按照设定的方向排列,不会折行。
FillLayout不会自动拆行,能设置每个控件之间的间隙spacing以及与面板四周的补白marginHeight, marginWidth,但不能设置每个控件的大小
详见HelloWorld.java中的useFillLayout()方法
RowLayout
RowLayout比FillLayout稍微复杂一些,填空控件时可以折行显示,并且可以使用RowData设置某一个制定控件的大小。
详见HelloWorld.java中的useRowLayout()方法
GridLayout
类似于网页中使用的表格布局,与RowLayout一样,可以对放置的控件设置一个布局数据对象GridData。 GridLayout的强大之处在于,可以为每个控件设置不同的布局。
GridLayout根据numColumns采用横向蛇形排列顺序。即先从左到右横向排列,用完numColums之后又回到左边继续排列,numColumns默认为1
使用GridData可以使用为GridData传入GridData的常量类设置,也可以设置GridData对象的各个属性值。每个控件在某一时刻只能有一个GridData,也就是说将新的GridData绑定到某个控件时会解绑定之前的GridData(不要重用GridData对象,GridLayout为每个未设置GridData的控件提供默认的GridData对象)
FormLayout
FormLayou的属性
FormLayout通过设置FormData的top, bottom, left和right属性来设置控件每条边的位置。 这些属性的值通过FormAttachment对象提供。这一FormAttachment指定某一控件的一边到父类容器类的位置或者其他控件之间的距 离。因此,FormLayout可能指定两个控件的相对位置,能随窗口的改变而改变。
使用FormData的属性
StackLayout
StackLayout布局类似于选项卡,当前只显示最上方的控件。
通过设置StackLayout.topControl=###来设置最上方显示的控件。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。