代码
package cn.haibin.rcp.test.oscblog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/**
* 功能说明:基于SWT的单窗口演示程序
*
* @author cn.haibin
*
*/
public class SwtHelloWorld {
public static void main(String[] args) {
final Display display = Display.getDefault();// Display多线程操作负责管理事件循环和控制UI线程和其它线程之间的通信
final Shell shell = new Shell(); // shell是程序的主窗口
shell.setSize(300, 200); // 设置主窗口的大小
shell.setText("HelloWorld"); // 设置主窗口的标题
/**
* 在这个地方:创建主窗口中所包含的其他控件 .......
*/
shell.layout(); // 应用界面布局
shell.open(); // 打开shell主窗口
while (!shell.isDisposed()) {// 如果shell主窗口没有关闭,则一直循环
if (!display.readAndDispatch())
display.sleep(); // 如果display不忙,就让display处于休眠状态
}
display.dispose(); // 释放display资源
}
}
运行结果
###知识拓展 本来自己想说点啥,看到一篇文章:SWT全接触,总结的十分,十分到位,我也就不班门弄斧了。直接拿来分享(http://my.oschina.net/quanzhong/blog/271087)
-
Display 这是一个顶层容器组件,类似于Container或Component的功能,它主要负责与底层的窗口系统之间的连接。在具体含义上,它代表"屏幕"。 一个Display可以包含多个Shell(也是容器组件,下面会介绍到)。 通常情况下,一个应用程序只含一个Display,即Display通常是一个单例组件(Singleton)。
-
Shell 它表示位于"屏幕"上面的"窗口",是Composite组件和Control组件构成的组件树的根。 在我们的HelloWorld程序中,我们可以设置标题(setText()),设置大小(setSize()),然后通过open()方法来显示这个窗口。怎么样,感觉很像JFrame吧?其实功能上差不多。
-
Composite 可以包含其它Composite和Control的容器
-
Control 这是一个重量级(HeavyWeight)系统对象。像按钮(Button),标签(Label),表格,工具栏和树形结构这些组件都是Control的子类,Conposite和Shell也不例外。
-
消息循环 我们可以看到,上面的代码中有这样的语句:
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep ();
}
如果你像我一样是由Java语言起步的,那么你会对这个消息循环的代码感到比较陌生,毕竟在SWING中我们主要利用事件驱动模型而不这样利用类似于Windows程序设计中的消息循环的方法来处理事件。但是这段代码意义还算简单明了,就是反复的读取和分派(dispatch)事件,并在没有事件的时候把控制权还给CPU。
- 资源的释放 最后一条语句是display.dispose ();,这告诉我们操作系统的资源是由程序员显示释放的。资源的释放遵循以下两条规则:
- 如果你创建了某个资源,那么你就有责任释放它。
- 释放父组件资源的同时也释放了其子组件的资源。
-
标准构造函数 窗口组件被创建的时候必须伴随一个他的上层组件,例如,我要建立一个按钮就可以采用如下方法:Button button = new Button(shell, SWT.PUSH); 其中,Button的父组件Shell是必不可少的,这样就限定了我们生成组件的顺序。 第二个参数被称为"Style Bit",表示了这个组件的显示特性,每种特性占一位,如下例所示: Text test=new Text(group, SWT.SINGLE|SWT.BORDER); 这条代码生成了一个单一的,有边框的文本框。这显然又与习惯了JavaBeans模型,总是用setXXX()来设置属性的我们不太适应--毕竟是IBM的东西啊,秉承了其产品不易上手的传统。
-
shell类不能被继承 虽然没被定义成final类型,但其父类Decorations有一个checkSubclass()方法,继承shell类都会在执行此方法是抛出异常SWTException:Subclass not allowed.在面向对象的设计原则中,组合优于继承,SWT中组件最好都不要使用继承来扩展,而大部分JFace组件可以通过继承来扩展。
最后,再分享一个大侠的佳作:http://my.oschina.net/nutzfans/blog/495134。绝对的清晰、全面。