在QNX平台上开发Java应用程序 1- -| 回首页 | 2006年索引 | - -vi使用注记

在QNX平台上开发Java应用程序 4

                                      

4.1 SWT类库的安装和配置

Eclipse 项目的发布在IT界可以说是一次震撼,这不仅仅是因为IBM 公司无偿公开了花费4000万美元开发出来的一整套代码,也不仅仅是因为支持这个项目的包括目前在市场上相当吃香的Rational, Borland, Red Hat以及QNX等公司。最让人吃惊的是:Eclipse 项目的矛头直接针对的是IBM公司最亲密无间的Java合作夥伴 -- Sun公司。就象Eclipse这个名字所意味的那样,IBM 的目的是要建立一套各种程序设计语言都能够使用的模块化的开发平台,并且希望它能够成为一个业界公认的标准平台。

Eclipse 项目中最令人震撼的一点是它用称为SWT的的图形库和工具包取代了Java标准中的AWT和Swing。根据Eclipse项目的解释,SWT直接调用了 操作系统的图形库,从而使得Java应用程序的Look & Feel 与操作系统的习惯完全一致;更为重要的是,对本地方法的直接调用大幅度的提高了基于SWT 的Java应用程序的运行速度。关于SWT与AWT/Swing的优点和缺点我们将在这一章的第三节中进行比较和讨论。

为了在我们的Java应用程序中使用SWT,我们需要做一点必要的配置,如下:

(1) /usr/eclipse/plugins/org.eclipse.core.runtime/runtime.jar 是Eclipse平台的运行库,需要将它放到类路径里面。
(2) /usr/eclipse/plugins/org.eclipse.ui/workbench.jar是Eclipse 平台的图形界面库,需要把它放到类路径里面。
(3) /usr/eclipse/plugins/org.eclipse.swt/ws/photon/swt.jar里面是SWT 的基本类库,需要将它放在类路径里面。
(4) /usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86 这个目录下面存放的是SWT 与本地方法的接口,需要放在LD_LIBRARY_PATH里面。

修改.profile文件,如下:

export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.core.runtime/runtime.jar
export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.ui/workbench.jar
export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.swt/ws/photon/swt.jar
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86

改动过这些设置以后,最简单的办法是重新启动Photon来让这些新的设置生效。

4.2 一个简单的SWT图形用户界面

通常来说,构建一个基于SWT 的图形用户界面需要经过如下步骤:

(1) 创建一个Display对象,该对象代表一个SWT 进程(session)。
(2) 创建一个或者是多个Shell对象,一个Shell对象相当于我们在AWT/Sing里面所说的顶极容器,也就是应用程序的主窗口。
(3) 在Shell对象上面创建用户所需要的控件。
(4) 初始化所有的控件,包括大小和初始值等,为控件的事件注册必要的监听器Listener。
(5) 打开主窗口。
(6) 启动事件处理循环,一直到用户结束程序的运行。
(7) 垃圾回收。

下面是一个简单的基于SWT 的Java应用程序HelloSwt:


import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;

public class HelloSwt
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
Label label = new Label(shell, SWT.CENTER);
label.setText("Hello SWT!");
label.setBounds(shell.getClientArea());
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}

使用下面的命令编译以上例程:

#j9c -classpath $CLASSPATH HelloSwt.java

使用下面的命令运行以上例程:

#j9 HelloSwt

我 们可以看到,基于SWT的图形用户界面在外观上和基于AWT的图形用户界面有明显的不同。更为重要的是,能够明显的感受到HelloSwt的启动速度比 HelloAwt要快很多。 QNX 高效的微内核图形界面系统当然是提高用户应用程序运行速度的一个方面,但是更重要的是SWT 直接调用了QNX 的微内核图形界面系统的功能,而AWT 则没有利用到操作系统所提供的这些优势。

SWT 是一套与AWT/Swing 完全不同的图形界面系统,新接触SWT 的程序员还是需要花费一段时间来熟悉SWT的结构和API。下面推荐的几个参考资料能够让你轻松的开始利用SWT 进行图形用户界面设计:

The Programmer's Guide for Eclipse, 这是Eclipse项目发布的官方程序员手册,其PDF 版可以从这个地址下载:

http://www.eclipse.org/documentation/pdf/org.eclipse.platform.doc.isv.pdf

这份文档也可以从这个网站联机查看:

http://download.eclipse.org/downloads/documentation/2.0/html/plugins/org.eclipse.platform.doc.isv/

另外,www.eclipse.org最近在其网站上发布了关于SWT的结构及其应用的一系列文章,也非常的有参考价值。如果有感兴趣的网友,请自行到 Eclipse 的网站查看。

4.3 关于SWT和AWT/Swing的一点讨论

通 过3.3 的讨论我们知道在AWT 中的图形用户界面是通过本地方法来实现的,每个AWT 方法都有一个与其对应的本地方法,称为peer。由于平台无关性的需要,AWT 所能够实现的功能是各种不同操作系统的图形库所提供的功能的交集。通过这种机制,在所有的平台上相同的AWT 控件的Java代码是一样的,其性能也是类似的。SWT 所采取的则是一种完全相反的方法,它是通过一些本地方法将操作系统的图形库完全的暴露给虚拟机。在这些本地方法的基础上,SWT 通过纯粹的Java代码实现了需要的图形界面功能。由于各个操作系统所提供的图形库是不一样的,同样一个控件在不同平台上的Java实现通常来说是不一样 的。基于同样的道理,同样的SWT 程序在不同平台上的性能和表现也许是不一样的。

SWT 所采取的这种方法决定了它在技术上要比AWT 要具有更多的优点,如下:

(1) 如果操作系统A 支持某种图形控件而操作系统B 不支持,AWT 就会出于平台无关性的要求拒绝提供这个控件。SWT 则会在操作系统A 上原封不动的调用操作系统所提供的控件,在操作系统B 上则使用该操作系统所提供的其它功能对该控件进行模拟。例如Windows平台本身就提供了树和表格等控件而其它一些操作系统不提供这些控件,SWT 在Widnows平台上就会直接调用Windows的方法来实现这些控件,AWT 为了实现平台无关性拒绝提供这些控件,Swing 则为了实现纯Java的目的在AWT 的基础上自己来画这些控件 -- 尽管它画出来的东西很少有画得好的。

(2) 由于SWT 大量的采用了本地平台所提供的图形库,SWT 中的控件风格跟本地平台的UI风格是完全一致的,因为在SWT 中的控件基本上就是操作系统本身的控件。这一点对于AWT 来说是比较相似的,但是Swing 的表现就不太一样了,譬如说在Windows XP上面用Swing 画一颗树它看起来就跟Widnows 2000上面的树一模一样,尽管Windows XP跟Widnows 2000本身的树形控件是不一样的。

(3) 在SWT中,大部份的事物逻辑都是用Java写的,在SWT 中C/C++代码的比重远比AWT中C/C++代码比重要小。这样使得程序设计人员能够更加方便的对SWT 应用程序进行调试,也能够更清楚的知道在后台运行的本地方法究竟在做什么事情。更为重要的是,SWT利用比AWT 更少的C/C++ 代码实现了比AWT 更快的图形用户界面,这个优势在嵌入式应用中往往是决定性的。

SWT 的缺点主要在于两点:(1) 不是Java语言标准;和(2) 支持的平台太少。目前版本的Eclipse仅仅支持Windows 98/ME/2000/XP, RH 7.1, SuSE 7.l, Solaris 8, QNX, AIX和HP-UX几个有限的平台。而作为Java 语言标准的AWT/Swing 则在目前大部份的主流和非主流操作系统上都有支持。

【作者: bom】【访问统计:】【2006年12月28日 星期四 11:06】【 加入博采】【打印

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=5995567

回复

验证码:   
评论内容: