产品的迁移工作接近尾声了,在这次迁移中,首次使用SWT,没什么SWT方面的经验,虽然我负责的是外围模块,使用SWT不是很多,但也算见识了SWT的一些优点和不足(指我认为的不足),这几点给我们的计划带来了不少影响,导致进度一拖再拖,发布日期一变再变,以后再用SWT,要长些心眼。以下就是我认为的SWT的几点不足:
1、SWT对象的构造,总要以父容器为参数传进构造函数,如在shell中加入一个button,对比AWT或Swing,会发现基本是倒过来一样。这个倒不能说是不足,还有些人说SWT的写法更符合面向对象的理念,但我总觉得有点别扭,特别是熟悉AWT的写法之后,再来用SWT,就算SWT的写法是对的,心里面还是觉得不应该这样做。这也有点习惯在捉弄吧。
- SWT写法:
- Button button = new Button(shell, SWT.NONE);
- button.setText("OK");
- AWT写法:
- Button button = new Button("OK");
- panel.add(button);
2、SWT多平台支持。由于产品需要支持MacOS、AIX、Soloris power pc/x86、HPUX、Linux(redhat/ubuntu/suse...),在这多平台支持上面的开发与调试,耗掉了不少的人日。SWT严重依赖于系统底层,不同的系统,需要不同的SWT.jar才能使产品正常地运行,即使同一平台,对Jar包的依赖也有点差异,这里就拿满地开花的Linux来说事了。本来产品用的Jar是拿eclipse 3.5的,在redhat/ubuntu/suse11上测试都没问题,结果在suse10上测试就出问题了,调试了两三天,最后换了eclipse3.4下面的SWT.jar,就能运行了,但3.4的SWT.jar与3.5的SWT.jar存在不少差异,也能随便地把包降为3.4,而且是核心包,更换后又要花大力气测试,正可谓“这也不是,那也不是”。
3、SWT bit-version问题。这个问题我在 处理SWT bit版本与JDK bit版本的对应 做了说明,这又是一上让人纠结的问题。在使用SWT的时候,特别要考虑好这个问题。其实,这个问题有一个方法比较容易处理,就是捆绑JRE,不允许用户更改JRE,这样就不存在这种问题了。而我们的产品虽然已经捆绑了JRE,但还是允许用户选择自己安装的JRE,这样就容易出现这种问题。我觉得这个也算是SWT的不足,严重依赖底层,不同bit-version的JVM支持不好。一般常识,32位的能在64位上跑,64的不能在32位上跑,但32位的SWT只能在32位JVM上跑,不能上64位JVM上跑。
4、SWT的多线程问题。虽然SWT提供了Display.asyncExec和Display.syncExec来处理多线程问题,但偶尔还是存在一些多线程的问题。比如,你在一个Composite里面用多线程实现一个小球在滚动,然后直接点该小程序的“关闭”图标,这时可能会报“wedget is disposed ” 异常。当然,这种问题也不能说是SWT控制得不好,完全可以改改代码,把Display、Shell都做一下调整,就可以避免这种问题出现,但是这样调整过的代码,难免会让人觉得“不是人写的”(呵,说得有点夸张了)。
5、CheckBox、RadioBox的Text为空或null时,在个别操作系统时会出现半个矩形的图案。代码如下所示,这种写法在ubuntu11.4在运行时,点击checkbox或radiobox,会在checkbox或radiobox的右侧出现一个半矩形。按照SWT的规定,checkbox或radiobox的说明是写在该控件的右侧的,但有时候我们需要写在控件的左侧,这时就会把对应控件的Text设置为空,这样运行在ubuntu就出现这个问题,而在redhat、windows则不存在这个问题。这个问题确实不好解决,查找了很多资料,终于找到一个有用的链接了,原来这个问题是早就存在了,在eclipse3.5的时候就有人提过了(2010年提过。我们用的jar恰好是eclipse3.5的),并且提了PR给eclipse项目组,该PR的最近一次更新是2012年3月,这个问题还是没给解决,部分人说这个不能算SWT的Bug,是因为我们使用不当导致的,因为给这些控件的Text设置非空值,也就是说控件的说明不能放在左侧只能放在右侧,呵呵,我们这回踩到地雷了,就按照他们说的做吧,虽然效果看起来差了点,但是再调整一下大小,可以弥补回这点不良效果的。该PR的链接是“checkBox with null text will display a empty rectangle”
- Button checkbtn = new Button(shell, SWT.CHECK);
- checkbtn.setText(null);//或 checkbtn.setText("");
- //Button radiobtn = new Button(shell, SWT.RADIO);
- radiobtn .setText(null);//或 radiobtn .setText("");
以上几点就是最近使用SWT的几点总结,说是SWT的不足,主要是要给自己提个醒,以后要注意一点,SWT不能什么都给你准备好。了解得也不是很多,在后续的日子再认真研究一下SWT,这个跟Swing抢天下的组件。
出处:http://blog.csdn.net/neetgo/article/details/7866475