下面再让我们进一步分析SWT API的组成。所有的SWT类都用org.eclipse.swt做为包的前缀,下面为了简化说明,我们用*号代表前缀org.eclipse.swt,比如*.widgets包,代表的是org.eclipse.swt.widgets包。
我们最常用的图形构件基本都被包括在*.widgets包中,比如Button,Combo,Text,Label,Sash,Table等等。其中两个最重要的构件当数Shell和Composite。Shell相当于应用程序的主窗口框架,上面的例子代码中就是应用Shell构件打开一个空窗口。Composite相当于SWING中的Panel对象,充当着构件容器的角色,当我们想在一个窗口中加入一些构件时,最好到使用Composite作为其它构件的容器,然后再去*.layout包找出一种合适的布局方式。SWT对构件的布局也采用了SWING或AWT中Layout和Layout Data结合的方式,在*.layout包中可以找到四种Layout和与它们相对应的布局结构对象(Layout Data)。在*.custom包中,包含了对一些基本图形构件的扩展,比如其中的CLabel,就是对标准Label构件的扩展,上面可以同时加入文字和图片,也可以加边框。StyledText是Text构件的扩展,它提供了丰富的文本功能,比如对某段文字的背景色、前景色或字体的设置。在*.custom包中也可找到一个新的StackLayout布局方式。
SWT对用户操作的响应,比如鼠标或键盘事件,也是采用了AWT和SWING中的Observer模式,在*.event包中可以找到事件监听的Listener接口和相应的事件对象,例如常用的鼠标事件监听接口MouseListener,MouseMoveListener和MouseTrackListener,及对应的事件对象MouseEvent。
*.graphics包中可以找到针对图片、光标、字体或绘图的API。比如可通过Image类调用系统中不同类型的图片文件。通过GC类实现对图片、构件或显示器的绘图功能。
对不同平台,Eclipse还开发了一些富有针对性的API。例如,在Windows平台,可以通过*.ole.win32包很容易的调用ole控件,这使Java程序内嵌IE浏览器或Word、Excel等程序成为可能!
要进一步了解SWT的情况,可以在Eclipse IDE的帮助文档中找到SWT的JavaDoc说明。当然最深入的了解莫过于去读SWT的源代码,这也正是开放源代码项目对程序员的魅力所在!
更复杂的程序
下面让我们展示一个比上面例子更加复杂一些的程序。这个程序拥有一个文本框和一个按键,当用户点击按键的时候,文本框显示一句欢迎信息。
为了文本框和按键有比较合理的大小和布局,这里采用了GradLayout布局方式。这种布局是SWT中最常用也是最强大的布局方式,几乎所有的格式都可能通过GradLayout去达到。下面的程序也涉及到了如何应用系统资源(Color),以及如何释放系统资源。
2 //为Shell设置布局对象
3 GridLayout gShellLay = new GridLayout();
4 shell.setLayout(gShellLay);
5 //构造一个Composite构件作为文本框和按键的容器
6 Composite panel = new Composite(shell,SWT.NONE);
7 //为Panel指定一个布局结构对象。这里让Panel尽可能的占满Shell,也就是全部应用程序窗口的空间。
8 GridData gPanelData = new GridData(GridData.GRAB_HORIZONTAL|GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
9 panel.setLayoutData(gPanelData);
10 //为Panel也设置一个布局对象。文本框和按键将按这个布局对象来显示。
11 GridLayout gPanelLay = new GridLayout();
12 panel.setLayout(gPanelLay);
13 //为Panel生成一个背景色
14 final Color bkColor = new Color(Display.getCurrent(),200,0,200);
15 panel.setBackground(bkColor);
16 //生成文本框
17 final Text text = new Text(panel,SWT.MULTI|SWT.WRAP);
18 //为文本框指定一个布局结构对象,这里让文本框尽可能的占满Panel的空间。
19 GridData gTextData = new GridData(GridData.GRAB_HORIZONTAL|GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
20 text.setLayoutData(gTextData);
21 //生成按键
22 Button butt = new Button(panel,SWT.PUSH);
23 butt.setText("Push");
24 //为按键指定鼠标事件
25 butt.addMouseListener(new MouseAdapter(){
26 public void mouseDown(MouseEvent e){
27 //当用户点击按键的时候,显示信息
28 text.setText("Hello SWT");
29 }
30 });
31 //当主窗口关闭时,会触发DisposeListener。这里用来释放Panel的背景色。
32 shell.addDisposeListener(new DisposeListener(){
33 public void widgetDisposed(DisposeEvent e) {
34 bkColor.dispose();
35 }
36 });
37 }
38
把这段代码中的方法initShell()加入到第一个打开空窗口的例子中,得到的是一段能成功运行的完整GUI应用程序。运行方法可参考第一个例子。