SWT总结-基础和布局管理器

最近复习了一下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 方法与操作系统进行交互。

 

重要方法

  • Display() - 创建 Display 事例,并创建一个 UI 线程
  • readAndDispatch()- 读取操作系统事件队列中的事件,如果队列中还有事件,则返回 true ,如果该 UI 线程处于等待状态 (Sleep) 则返回 false.
  • Sleep()- UI 线程休息一下,直到队列中有新的事件或者其他唤醒的动作,当一个需要 dispatch 的事件被放入到消息队列中时

 

Shell类

 

Shell类就是窗口,即Swing里面的JFrame,可以是顶级窗口(创建时传入的是Display对象),也可以是Secondary或者对话框窗口(创建是传入的是Shell对象)。
Shell的继承结构

 

常用方法

  • Open() – 打开窗口,并设置该窗口为激活状态

 

3. 接下来还需要了解一下SWT包的基本结构和作用,这对于SWT的整体把握有好处

 

org.eclipse.swt

SWT constants and error handling support.

org.eclipse.swt.accessibility

Eclipse 已访问性包,专为残疾人设计

org.eclipse.swt.awt

提供在 SWT 中嵌入 AWT 程序的接口

org.eclipse.swt.browser

提供实现浏览器功能的部件

org.eclipse.swt.custom

提供一个自定义的部件(相对于本地部件而言)

org.eclipse.swt.dnd

SWT Drag and Drop support.

org.eclipse.swt.events

提供 SWT 事件监听器的支持 Event Listener 以及默认 Adapter 实现类和 Event

org.eclipse.swt.graphics

SWT graphics classes. Color Font Image

org.eclipse.swt.layout

FillLayout, GridLayout, RowLayout, FormLayout

org.eclipse.swt.ole.win32

提供了 SWT Win32 OLE 实现的一些类

org.eclipse.swt.opengl

SWT OpenGL support.

org.eclipse.swt.printing

支持打印机的类

org.eclipse.swt.program

支持在 SWT 程序中使用其他应用程序打开文件

org.eclipse.swt.widgets

最常用的 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设置某一个制定控件的大小。

 

  • 通过wrap设定是否折行显示,默认为true,即当一行不够时折行显示。
  • 通过pack设定是否平均分配控件大小,默认为true,即按照控件所需分配大小。
  • 通过justify设定是否充满整行,默认为false,设成true时,通过控件的间距来调整,此时若外容器足够大,则spacing属性不起作用。
  • 通过fill属性设置等宽、等高属性。水平分布时将控件设置同样高度,垂直分布时,将控件设置同样宽度,默认为false。
  • 通过spacing, marginBottom, marginLeft,marginTop,marginRight等设置间隙和补白。

 

 

详见HelloWorld.java中的useRowLayout()方法

 

 

GridLayout


类似于网页中使用的表格布局,与RowLayout一样,可以对放置的控件设置一个布局数据对象GridData。 GridLayout的强大之处在于,可以为每个控件设置不同的布局。

 

GridLayout根据numColumns采用横向蛇形排列顺序。即先从左到右横向排列,用完numColums之后又回到左边继续排列,numColumns默认为1

  • 通过makeColumnsEqualWidth强制让所有的列都具有相同的宽度,和RowLayout的wrap相似。
  • 通过horizontalSpacing,verticalSpacing, marginBottom, marginLeft,marginTop,marginRight等设置间隙和补白,默认为5像素。


使用GridData可以使用为GridData传入GridData的常量类设置,也可以设置GridData对象的各个属性值。每个控件在某一时刻只能有一个GridData,也就是说将新的GridData绑定到某个控件时会解绑定之前的GridData(不要重用GridData对象,GridLayout为每个未设置GridData的控件提供默认的GridData对象)

  • 通过GridData.horizontalAlignment和verticalAlignment设置放置单元格的对齐方式,即设置在GridLayout的容器中的控件的对齐方式,,水平默认左对齐,垂直默认居中对齐。
  • 通过GridData.horizontalIndent和verticalIndent设置控件水平和垂直方向缩进的像素大小,默认为0。
  • 通过GridData.horizontalSpan和verticalSpan属性设置单元格水平跨越和垂直跨越的单元格数。
  • 通过设置GridData.grabExcessVerticalSpace和grabExcessHorizontalSpace在窗口变大的时候抢占新空间。通常在一个应用程序窗口中,需要至少一个抢占式控件,如果多于一个控件试图抢占同样的空间,那么额外的空间会被均匀分配。
  • minunumHeight和minimumWidth设置控件最小的宽度和高度,此属性只有在上一属性为true时才生效。
  • widthHint和heightHint设置控件的长宽,该属性只有在程序一开始运行时才会起作用,随着窗口的改变,会重新计算控件的大小

 

FormLayout

 

FormLayou的属性

  • 通过horizontalSpacing,verticalSpacing, marginBottom, marginLeft,marginTop,marginRight等设置间隙和补白,默认为0像素,与GridLayout不同。

FormLayout通过设置FormData的top, bottom, left和right属性来设置控件每条边的位置。 这些属性的值通过FormAttachment对象提供。这一FormAttachment指定某一控件的一边到父类容器类的位置或者其他控件之间的距 离。因此,FormLayout可能指定两个控件的相对位置,能随窗口的改变而改变。
使用FormData的属性

  •  FormAttachment的够着函数是FormAttachement(int numerator, int denominator(默认100), int offset),指定某一个控件的某条边是numerator:denominator位置+offset像素。例如:formDta.left = new FormAttachment(30, 70, 0)表示左边处于整个composite的30:70,并且偏移为0。
  • 通过FormAttachment(Control c, int offset, int alignment)设定相对于控件c的alignment位置偏移offset。Alignment使用样式常量,SWT.TOP,BOTTOM,LEFT,RIGHT,CENTER,DEFAULT。例如,formData.left = new FormAttachment(bt1, 20, SWT.RIGHT)即距bt1右边距20个像素。

 

 

 

 

StackLayout

 

StackLayout布局类似于选项卡,当前只显示最上方的控件。
通过设置StackLayout.topControl=###来设置最上方显示的控件。

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值