SWT 初探

一 swt 简单介绍:
正如 Eclipse 的 Web 站点上所提到的,Eclipse 是一种通用工具平台。它是一个开放的、可用于任何东西的可扩展 IDE,没什么特别之处,它为工具开发人员提供了灵活性以及对软件技术的控制。

Eclipse 为开发人员提供了生产大量 GUI 驱动的工具和应用程序的基础。而这项功能的基础就是 GUI 库 SWT 和 JFace。

SWT 是一个库,它创建了Java 版的本地主机操作系统 GUI 控件。它依赖于本机实现。这意味着基于 SWT 的应用程序具有以下几个关键特性:
1.它们的外观、行为和执行类似于“本机”应用程序。
2.所提供的窗口小部件(widget)反映了主机操作系统上提供的窗口小部件(组件和控件)。
3.主机 GUI 库的任何特殊行为都在 SWT GUI 中得到反映。

这些目标使得 SWT 不同于 Java 技术的 Swing,Swing 的设计目标是消除操作系统的差异。

在开始之前,我需要介绍一些 SWT 术语:
Widget —— 基本的 SWT GUI 组件(类似于 Java AWT 中的 Component 和 Swing 中的 JComponent)。Widget 是一个抽象类。
Control —— 拥有操作系统的对等物的窗口小部件(换句话说,在操作系统中具有同一身份)。Control 是一个抽象类。
Composite —— 包含其他控件的控件(类似于 Java AWT 中的 Container 和 Swing 中的 JPanel)。
Item —— 其他控件包含的窗口小部件(该控件可能不是复合控件),比如列表和表。注意,包含一些项的控件很少包含其他控件,反之亦然。Item 是一个抽象类。

二  SWT中的Display 对象和 Shell对象 :
下面我来介绍两个非常重要的SWT中的对象,一个是Display对象,另外一个是shell对象,他们是一切的基础
我们书写swt程序的步骤,这些步骤是:

1.      创建一个Display对象

2.      创建一个或者多个Shell对象,你可以认为Shell代表了程序的窗口。

3.      在Shell内创建各种部件(widget)

4.      对各个部件进行初始化(外观,状态等),同时为各种部件的事件创建监听器(listener)

5.      调用Shell对象的open()方法以显示窗体

6.      各种事件进行监听并处理,直到程序发出退出消息

7.      调用Display对象的dispose()方法以结束程序。

Display:与操作系统沟通的桥梁

我们在前面说过,每个swt程序在最开始都必须创建一个Display对象。Display对象起什么作用呢?它是swt与操作系统沟通的一座桥梁。它负责swt和操作系统之间的通信。它将swt/JFace的各种调用转化为系统的底层调用,控制操作系统为swt分配的资源。同时我们也可以通过Display对象得到操作系统的一些信息。

Display是一个“幕后工作者”,它为swt/JFace提供支持,但是你并不能够从某个用户界面中看到它的影子。

在前面的Hello,world!程序中,我们可以看到构建一个Display对象是和普通的Java对象一样通过构造函数实现的。它为实现图形界面准备了最基本的条件。而在程序结束时我们必须显式地调用dispose() 方法来释放程序运行中所获得的资源。一般来说,一个程序只需要一个Display对象,当然没有人禁止你创建多个Display对象。但是在swt的javadoc中,我们可以看到关于这个问题一些描述:

“Applications which are built with SWT will almost always require only a single display. In particular, some platforms which SWT supports will not allow more than one active display. In other words, some platforms do not support creating a new display if one already exists that has not been sent the dispose() message.”

Display有着众多的方法,我们不可能一一介绍。在这里只挑选几个可能会比较常用的作一些简单介绍。

setData()和getData():这一对函数允许我们为Display对象设定一些数据,setData()的参数中key和value类似于我们在使用Map对象中key和value的含义。

getShells()得到关联到该Display对象的所有没有dispose的Shell对象

getCurrent()得到与用户交互的当前线程

readAndDispatch()得到事件并且调用对应的监听器进行处理

sleep()等待事件发生

Shell:窗口

一个Shell对象就是一个窗口。你可以在上面放置各种部件创建丰富的图形界面。

我们都知道窗口有很多种,比如窗口有可以调整大小的,有不可以的,有的没有最大化最小化按钮。这些窗体的特征在swt中被成为风格(style)。一个窗体的风格可以用一个整数进行定义。这些风格的定义在org.eclipse.swt.SWT中。

Shell对象可用的风格包括:BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE , PLICATION_MODAL, MODELESS, PRIMARY_MODAL,S YSTEM_MODAL

这些风格我们不作一一介绍,你可以从他们字面意义看出一些含义来,当然也可以参考对应的javadoc。

我们可以在一个Shell的构造函数中定义它的风格,比如在前面的Hello,world!程序中,我们可以这样定义Shell。
Shell shell = new Shell(display,SWT.CLOSE | SWT.SYSTEM_MODAL);
最后得到的窗体没有最大化和最小化按钮,并且大小是固定不变的。

因为swt运行于各种平台之上,而这些平台上的窗口管理器千差万别,所以所有这些风格都不是肯定可以实现的。在swt的javadoc中,这被称为暗示(hints)。

Shell对象的方法大都和GUI有关,比如setEnabled()设定了窗体是否能够和用户进行交互,setVisble()设定了窗体是否可见,setActive()将窗体设为当前的活动窗口。

我们可以用open()方法打开一个窗体,close()方法关闭一个窗体。

三:SWT 常用组件
1按钮组件(Button)

  (1)Button组件常用样式

    SWT.PUSH按钮

    SWT.CHECK多选按钮

    SWT.RADIO单选按钮

    SWT.ARROW箭头按钮

    SWT.NONE默认按钮

    SWT.CENTER文字居中与SWT.NONE

    SWT.LEFT左对齐

    SWT.RIGHT右对齐

    SWT.BORDER深陷型按钮

    SWT.FLAT平面型按钮

    一个Button可以指定多个样式,只要将指定的各个样式用符号“|”连接起来即可

    Button bt=new Button(shell,SWT.CHECK|SWT.BORDER|SWT.LEFT);

    多选、深陷、左对齐

  (2)Button组件的常用方法

    setText(String string),设置组件的标签文字

    setBounds(int x,int y,int width,int height);//设置组件的坐标位置和大小

    setEnabled(Boolean enabled);设置组件是否可用,默认为true

    setFont(Font font);设置文字的字体

    setForeground(Color color);设置前景色

    setBackground(Color color);设置背景色

    setImage(Image image);设置显示用的图片

    setSelection(Boolean selected);设置是否选中,默认为false

    setToolTipText(String string);设置鼠标停留在组件上是显示的提示信息



2标签组件(Label)

  (1)Label常见式样

    SWT.CENTER  居中

    SWT.RIGHT  右对齐

    SWT.LEFT  左对齐

    SWT.NONE  默认样式

    SWT.WRAP  自动换行

    SWT.BORDER  深陷型

    SWT.SEPARATOR  分栏符,默认为竖线分栏符

    HORIZONTAL  横线分栏符



3文本框组件(Text)

  (1)Text常见式样

    SWT.NONE  默认式样

    SWT.CENTER

    SWT.RIGHT

    SWT.LEFT

    SWT.MULTI  可以输入多行,需回车换行

    SWT.WRAP  可以输入多行,自动换行

    SWT.PASSWORD  密码型,输入字符显示成“*”

    SWT.BORDER    深陷型

    SWT.V_SCROLL  垂直滚动条

    SWT.H_SCROLL  水平滚动条


4下拉框组件(Combo)

  (1)Combo常见样式

    SWT.NONE    默认

    SWT.READ_ONLY  只读

    SWT.SIMPLE    无需单击下拉框,列表会一直显示


  (2)Combo下拉框常用方法

    add(String string)  在Combo上添加一项

    add(String string,int index)  在Combo的第index(从0开始)项后插入一项

    deselectAll()    使Combo组件中的当前选项为空

    removeAll()      将Combo中的所有选项清空

    setItems(String[] items)  将数组中的各项依次加入到Combo中

    select(int index)  将Combo的第index+1项设置为当前选择项


5列表框组件(List)

  (1)List常见样式

    SWT.NONE    默认样式

    SWT.V_SCROLL  带垂直滚动条

    SWT.MULTI    允许复选

    SWT.SINGLE    允许单选

  (2)常用方法

    List和Combo组件的方法是一样的,但由于List可选择多项,而Combo只能选择一项

  ,所以List没有getText()方法,List的取值使用getSelection(),返回一个String

  数组。

6菜单(Menu,MenuItem)

    菜单(Menu、MenuItem)是常用的SWT组件,Menu是一个菜单栏,同时也是一个容器

  ,可以容纳菜单项(MenuItem)

  (1)Menu样式

    SWT.BAR    菜单栏,用于主菜单

    SWT.DROP_DOWN  下拉菜单,用于子菜单

    SWT.POP_UP    鼠标右键弹出菜单

  (2)MenuItem式样

    SWT.CASCADE    有子菜单的菜单项

    SWT.CHECK    选中后前面显示一个小勾

    SWT.PUSH    普通型菜单

    SWT.RADIO    选中后前面显示一个圆点

    SWT.SEPARATOR  分隔符

  (3)建立菜单一般步骤

    ①首先建立一个菜单栏,需要用到SWT.BAR属性

      Menu mainMunu=new Menu(shell,SWT.BAR);

    ②在窗体中指定需要显示的菜单栏

      shell.setMenuBar(mainMenu);

    ③创建顶级菜单项,需要使用SWT.CASCADE属性

      MenuItem fileItem=new MenuItem(mainMenu,SWT.CASCADE);

      fileItem.setText("file&F");

    ④创建与顶级菜单项相关的下拉式菜单

      Menu fileMenu=new Menu(shell,SWT.DROP_DOWN);

    ⑤将顶级菜单项与下拉菜单关联

      fileItem.setMenu(fileMenu);

    二级菜单的建立只需要重复③~⑤即可

容器类

1面板(Composite)

  (1)Composite常用方法

    getLayout()  获得布局管理器

    getLayoutData()    得到布局数据

    getParent()    得到容纳该容器的父容器

    getShell()    得到容纳该容器的Shell

    layout()    将容器上的组件重新布局,相当于刷新

2分组框(Group)

    Group是Composite的子类,所以两者用法基本相同。主要区别是Group显示有一个方框,且方

  框线上还可以显示说明文字

3选项卡(TabFolder、TabItem)

    选项卡包括一个选项卡(TabFolder类)和一个选项页(TabItem类),TabFolder是容器,可

  以容纳其它容器和组件,但TabItem不是容器,可以把它看成是一个选项标签,TabFolder通过

  TabItem来对其中的组件进行控制。每一个TabItem用setControl()来控制一个界面组件。
四 一个简单的例子:
Display display=new Display();
Shell shell = new Shell (display, SWT.CLOSE);
shell.setText("SWT 初探");
shell.setSize(600, 600);
Label label =new Label(shell,SWT.NONE);
label.setText("SWT 初探");
label.setBounds(0, 0, 100, 100);
shell.open();
while (!shell.isDisposed()) {
   if (!display.readAndDispatch())
      display.sleep();
    }
display.dispose();

五 参考资料:
http://www.ibm.com/developerworks/cn/opensource/os-jface1/
http://blog.csdn.net/chulaixi/article/details/3095478
http://www.cnblogs.com/happyPawpaw/archive/2012/10/19/2730478.html

猜你喜欢

转载自dingjinhong123.iteye.com/blog/2297543
swt