SWT(3)

转载 2006年06月18日 13:21:00
在任何操作平台的GUI系统中,对构件或一些图形API的访问操作都要被严格同步并串行化。例如,在一个图形界面中的按键构件可被设成可用状态(enable)或禁用状态(disable),正常的处理方式是,用户对按键状态设置操作都要被放入到GUI系统的事件处理队列中(这意味着访问操作被串行化),然后依次处理(这意味着访问操作被同步)。想象当按键可用状态的设置函数还没有执行结束的时候,程序就希望再设置该按键为禁用状态,势必会引起冲突。实际上,这种操作在任何GUI系统都会触发异常。

Java语言本身就提供了多线程机制,这种机制对GUI编程来说是不利的,它不能保证图形构件操作的同步与串行化。SWT采用了一种简单而直接的方式去适应本地GUI系统对线程的要求:在SWT中,通常存在一个被称为"用户线程"的唯一线程,只有在这个线程中才能调用对构件或某些图形API的访问操作。如果在非用户线程中程序直接调用这些访问操作,那么SWTExcepiton异常会被抛出。但是SWT也在*.widget.Display类中提供了两个方法可以间接的在非用户线程的进行图形构件的访问操作,这是通过的syncExec(Runnable)和asyncExec(Runnable)这两个方法去实现的。例如:

//此时程序运行在一个非用户线程中,并且希望在构件panel上加入一个按键。
Display.getCurrent().asyncExec(new Runnable() {
    public void run() {
        Button butt = new Button(panel,SWT.PUSH);
        butt.setText("Push");
    }
});


方法syncExec()和asyncExec()的区别在于前者要在指定的线程执行结束后才返回,而后者则无论指定的线程是否执行都会立即返回到当前线程。 

SWT的扩展:JFace


JFace与SWT的关系好比Microsoft的MFC与SDK的关系,JFace是基于SWT开发,其API比SWT更加易于使用,但功能却没SWT来的直接。比如下面的代码应用JFace中的MessageDialog打开一个警告对话框:

MessageDialog.openWarning(parent,"Warning","Warning message");


如果只用SWT完成以上功能,语句不会少于30行!

JFace原本是为更加方便的使用SWT而编写的一组API,其主要目的是为了开发Eclipse IDE环境,而不是为了应用到其它的独立应用程序。因此在Eclipse 2.1版本之前,很难将JFace API完整的从Eclipse的内核API中剥离出来,总是要多多少少导入一些非JFace以外的Eclipse核心代码类或接口才能得到一个没有任何编译错误的JFace开发包。但目前Eclipse组织似乎已经逐渐意识到了JFace在开发独立应用程序起到的重要作用,在正在开发的2.1版本中,JFace也开始变成了和SWT一样的完整独立的开发包,只是这个开发包还在变动中(笔者写本文时,应用的Eclipse2.1M3版本)。JFace开发包的包前缀是以org.eclipse.jface开头。JAR包和源代码也和SWT一样,也在${你的eclipse安装路径}/plugins路径下去找。

对开发人员来说,在开发一个图形构件的时候,比较好的方式是先到JFace包去找一找,看是不是有更简洁的实现方法,如果没有再用SWT包去自己实现。比如JFace为对话框提供了很好的支持,除了各种类型的对话框(比如上面用的MessageDialog,或是带有Title栏的对话框),如要实现一个自定义的对话框也最好从JFace中的Dialog类继承,而不是从SWT中的*.widget.Dialog继承。

应用JFace中的Preference包中的类很容易为自己的软件做出一个很专业的配置对话框。对于Tree、Table等图形构件,它们在显示的同时也要和数据关联,例如Table中显示的数据,在JFace中的View包中为此类构件提供了Model-View方式的编程方法,这种方法使显示与数据分开,更加利于开发与维护。JFace中提供最多的功能就是对文本内容的处理。可以在org.eclipse.jface.text.*包中找到数十个与文本处理相关类。

与应用程序更近一步


Java程序通常是以class文件的方式发布的,运行class需要JRE或JDK的支持。这又是Java GUI程序的另一个致命的弱点,想象对一个面向广大用户的应用程序来说,无论你的程序功能有多简单,或是你的代码十分的精简,你都不得不让用户去下载一个7、8M的JRE,那是多么令人沮丧的一件事。而且对程序员来说,Class通常意味着源代码的暴露,反编译的工具让那些居心叵测的人轻易得到你的源代码。虽然有很多对Class的加密方法,但那总是以牺牲性能为代价的。好在我们还有其它的方式可用:把Class编译成exe文件!

参考资料3提供了应用GCJ将SWT编译成exe文件的详细方法。作为对那篇文章的补充,就是目前也可以通过下载Cygwin得到Windows下的GCJ。 Excelsior也是笔者曾经用过的一款很好的编译器,唯一的遗憾就是它的价格!

通过SWT开发包,简单、跨平台、可靠等这些Java语言本身所具有的优点正渐渐融合到图形界面的应用程序开发中去。因此,我相信Java语言的另一扇成功之门正在逐渐打开。

参考资料:

http://www.e2one.com 极一软件工作室应用SWT&JFace API开发出的企业实时通讯IM软件,是SWT&JFace开发Standalone程序的范例。

http://www.eclipse.org/articles/swt-design-2/swt-design-2.html 这篇文章中详细论述了SWT开发者应该如何管理系统资源。

http://www-900.ibm.com/developerWorks/cn/linux/guitoolkit/j-nativegui/index.shtml 描述了如何将SWT程序应用GCJ编译成本机应用程序文件。

http://www-900.ibm.com/developerWorks/cn/java/l-eclipse/index.shtml 介绍了Eclipse的使用及简单的插件开发过程。

www.eclipse.org 所有的关于Eclipse, SWT, JFace的问题都可以在这里找到答案。也是下载Eclipse开发环境的网站。

http://www.cygwin.com/ 可以得得到Windows版本的GCJ。

关于作者

倪大鹏,有多年的软件开发经验,其中近四年的时间集中在Java相关技术的研究。可以通过e-mail: ndp@e2one.com与他联系。

如何打包swt,亲手实验过,成功

如何打包swt 用eclipse(这里使用代号为 luna)rcp版本操作,->File->Export->Java->JAR file->next按钮,选上你的项目和.classpath、.pro...
  • anh3000
  • anh3000
  • 2015年04月25日 20:50
  • 1266

SWT中使用Swing

在SWT出现之前,已经有众多的Swing程序和控件被开发出来,为了充分利用这些现有的资源,SWT需要提供一种在SWT中使用Swing控件的途径。 Swing是通过在AWT的Canvas控件上绘图以显...
  • jianggujin
  • jianggujin
  • 2016年05月17日 14:51
  • 2418

[新手必读] 既然有了Swing, 那为什么还要SWT?

(转载) Swing和SWT是采用不同的机制的,AWT是Swing的前身,实际上是调用本地操作系统的控件。由于在不同的操作系统下,提供的控件是不一样的,AWT采用最大公约数的办法,只提供所有操作...
  • pianistOfSoftware
  • pianistOfSoftware
  • 2016年07月15日 15:22
  • 2552

java SWT:限制数值输入的Text文本框通用组件

控制Text只能输入数值只能输入数值的原理很简单,就是利用VerifyListener侦听器,响应VerifyEvent 事件,对输入内容进行检查。 具体如何难输入的内容是有效数字,网上有很多文章介...
  • 10km
  • 10km
  • 2016年12月18日 18:46
  • 1623

swt 做界面时部分要点

//让窗口居中显示 shell.setLocation((display.getClientArea().width-shell.getSize().x)/2,  (display.get...
  • WenwenFighting1314
  • WenwenFighting1314
  • 2016年08月18日 11:17
  • 515

Eclipse4.3 swt 插件在线安装

到eclipse官网下载swt插件. 点击 "Downloads"
  • lhb_0531
  • lhb_0531
  • 2013年09月12日 19:03
  • 9296

强大的SWT-谁说Java不能做窗体

强大的SWT,谁说Java不能做窗体
  • l294333475
  • l294333475
  • 2013年07月29日 15:08
  • 3304

SWT Browser(内嵌浏览器)

browser浏览器swtbuttonurlstring 原文地址:http://blog.csdn.net/hemingwang0902/article/details/4405310 ...
  • luoww1
  • luoww1
  • 2013年11月12日 09:36
  • 4486

SWT编程基础-控件和图形资源

控件在SWT中,所有的控件都是从org.eclipse.swt.widgets.Control继承而来,如图所示: 最上层的Widget类直接继承自Object,是SWT中所有和窗口相关的部件的父类...
  • jianggujin
  • jianggujin
  • 2016年05月03日 11:10
  • 2482

SWT中各种参数大全

1按钮组件(Button)   (1)Button组件常用样式     SWT.PUSH按钮     SWT.CHECK多选按钮     SWT.RADIO单选按钮     SWT.ARRO...
  • wjy320
  • wjy320
  • 2014年01月06日 16:36
  • 1885
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SWT(3)
举报原因:
原因补充:

(最多只允许输入30个字)