我这几年虽然也做了一些相对底层的开发,如工作流等,但主要精力还是在Java UI上,所以对SWT和Swing相对还比较了解,在这里写下我对Swt和Swing的一件看法,供朋友参考。
这个问题放在三年前,根本不是一个问题,那个时候的Eclipse用户还比较少,而离开Eclipse的SWT也很难进行独立开发,因此开发UI,仍然是Swing的天下。
但是自从基于SWT的RCP正式提出以后,对于Java UI的开发者却不得不面对这样一个问题,SWT还是Swing。
其实对于这样的比较,对Swing是有一些不公平的,因为用SWT开发较大的程序,肯定会用到JFace,RCP,这样就好比是用C++与MFC来比较如何写窗口程序一样。严格说起来,应该是Eclipse的RCP和Spring的RCP进行比较才对。但是Spring的RCP我还没有多少使用经验,所以只好先进行一些不太公正的比较了,简单谈谈SWT和Swing的选择。
扩展性问题:
Swing是Sun在AWT失败后重新设计的UI,它不再直接调用本地接口,而是采用自己的UI接口处理一切图形绘制。这样做的结果很明显,它的Swing结构采用的MVC结构非常清楚而且很容易扩展,目前已经有许多漂亮的Swing组件, 但是对于新手级的程序员,要使用一些复杂的控件,如JTable,JTree,还是要花上很多时间学习的。但Swing的问题还是很多,象图形绘制速度慢,有时刷新有问题,线程处理好象也有些问题。
Swt是通过控件接口来调用本地API的控件,这样可以获得最本地化的外观效果,但是由于它是严重依赖于本地操作系统提供的控件,而且进行扩展的时候,要针对不同的操作系统进行测试,工作量很大,象我用的KTable在Linux下就有几个问题。这也是SWT控件严重缺乏的原因之一,还好Eclipse最近也成立新的项目组来开发Swt控件,相信不久以后会有好消息。
上手问题:
如果说上手,我从上想到下,还是觉得SWT更快一些。象JTable,我带的几个实习生,研究了一周还不明白怎么用,但是换成Swt,不到三天,就可以照着写程序了。因为Swt提供的是简单易用的API,而要用Swing,首先要明白Swing的结构,对于一般的程序员来说,自然是前者快一些了。
如果大家对些有怀疑的话,有空可以去
www.java2s.com上去看一看用Swt和Swing分别写一个Table,哪一个的API更容易理解。
不过SWT的资源管理确实是一个很大的问题,对于新手而言,结果可能是致命的,有得必有失。
框架问题:
框架也正是我前面说的不公平问题,Eclipse的Platform和RCP都已经提供了很好的开发框架,如Perspctive和View,Editor,PropertyEditor等。但Swing还没有一个很好的免费的框架,商用的有。因此拿这两者比较还是有失公平的。更不用说Eclipse还提供了很好的扩展机制和国际化处理。
现在好象Netbeans也提供了一部分框架的东西,而Spring的RCP也开始初现头角,不过领跑了一年的Eclipse RCP,Netbeans和Spring还是要努力的。
如果一个公司要做一个长期的产品,我只能说Swing在很大程序上还优于SWT,这个优于不是指性能,而是指API的稳定性。从Eclipse2-3.2,长期使用Eclipse的朋友最头疼的可能就是习惯的插件无法运行在新的Eclipse上。而Swing的API相对就稳定的多。
当然这里不是绝对不用SWT的,你可以可以在Swt中使用Swing,象Borland的Together for eclipse就是一个最好的例子,这样的结果就是我Eclipse3.0时使用的Community Version Together,在Eclipse3.1.2运行的很好,当然Borland这样做的原因之一也是因为它同时要提供JBuilder的Together,所以Swing是个唯一的选择,但是GEF的API不是很稳定,可能也是Borland放弃GEF的原因,使用了SWT+Swing的概念。
最后说一句,无论哪种比较,都只是片面的,还是要根据自己的情况选择合适的UI平台。