river_hiter

初次感受SWT

       由于无法忍受AWT或SWING的怪异界面和蜗牛般的速度,最近起了学习SWT的冲动。SWT(Standard  Widget  Toolkit)是由IBM推出的基于JAVA的图形界面开发库,之所以要说他是“基于JAVA的”的是因为在程序元编写代码时使用的JAVA语言,然而事实上,swt的底层代码是由C语言来实现的,这点可以从Swt为什么要发布基于windows,linux……的操作系统的不同的包体现出来。swt比起awt和swing来说,不可同日而语,并且swt具有很好的稳定性,他最大化了操作系统的图形构件API,只要操作系统提供了相应的图形构件,swt会用JNI技术去调用他们,只有在那些操作系统中不存在的图形构件,swt才回去实现他们。
    public class FirstSwt{
 public static void main(String [] args) {
  Display display = new Display();
  Shell shell = new Shell(display);
  shell.open();
  // 开始事件处理循环,直到用户关闭窗口
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch())
    display.sleep();
  }
  display.dispose();
 }
}
这是一个swt最基础的程序,也是一个很基础的模式,程序中首先定义了用Display display = new Display();定义了一个容器(component),然后用Shell shell = new Shell(display);定义了一个窗口(window),display是一个最大的容器,在此容器上可以放置很多shell,类似于awt的思想,每个组件自然就应该放置在shell中了。接下来的shell.open()将该shell打开,只有将shell打开之后,基于此shell上的组件才能被显示出来。接下来的语句就是一个处理这个shell中事件的语句,在shell没有被关闭前(shell.isDisposed()),系统会将所有的事件从事件队列中取出,然后一个一个处理,如果没有事件发生,则该display就处于sleep状态,等待事件发生后将其唤醒。当shell关闭后,程序也就退出了。

posted on 2006-11-08 21:36 何晏成 阅读(2229) 评论(23)  编辑  收藏

Feedback

# re: 初次感受SWT 2006-11-09 09:27 hhh

如果你非要这么说,
那么我也可说SWT在重用和灵活性方面不可和swing同日而语!

swing灵活和重用的艺术 renderer/editor

  说到GUI类库的重用有一个很著名的模式:Composite模式。对,一个现代面向对象GUI类库基本上都有这个模式的实现,当然也包括swing.不过早一点如MFC就没有完整的实现,现在来看如果一个GUI类库连基本的Composite模式都没有实现基本上感觉是出土的文物啦!
     但是我们来看即便有了Composite模式,但Composite模式通常是构建静态组合,如果要动态的替换一个复合组件内部的子元素如何办呢?如此一来这个组件就只能定义自己的布局形式,而不能定死在这个布局形式内的元素。
     其实从用户角度来说一个GUI元素通常就是两种情况要么就是表现,要么就是处于和用户交互状态,这是它们的形态通常不一样。所以组件不仅仅要只定义自己的布局形式,还要给于外部机会来配置当自己的子元素处于这两种状态时相应的UI组件是什么!
    
    swing通过renderer/editor达到了这种灵活性。如swing中JTable,JList,JTree等组件都只是定义了自己的布局形式。并且都可以配置renderer/editor,这样你的renderer/editor实现就接管了组件里面元素的表现形式和交互形态。理论上你可以用任何JComponent作为组件里面元素的表现形式和交互形态。其灵活性和重用性达到了一个巅峰!
    
    以前还聊过一个JTable的例子!
    http://www.douban.com/group/topic/1112689/



http://www.douban.com/group/topic/1261109/  回复  更多评论   

# re: 初次感受SWT 2006-11-09 09:32 hhh

Swing是MVC设计的典范
不管你的项目是否用到了Swing技术,我都要说,Swing是一个设计优秀的Java包,它充满了大师的智慧。如果你学了Java却连一个 Button还不会写,就象你学习Visual Basic却不会用Button,那可绝对是不能被原谅的。Swing技术的应用已经在国外大行其道,由于java的免费、易学以及大家对于java技术的充分信赖,好多公司早早的就把应用程序的一切,从后台服务到前台人机交互界面,统统移到了java开发上。Swing出现了快10年了,凭借其先进的设计思想,一直未曾落后于哪种语言的界面开发技术,使用和理解Swing的设计思想,对软件开发者大有裨益。
  
  Swing的设计是MVC的典范。虽然MVC的概念有点泛滥,可是真正能够理解并熟练掌握、在设计和开发里面自然流露的并不多见。记得用VC ++开发程序时候,MFC向导也是生成Document和View两个类,当时一直奇怪为什么这么绕圈子。再看Swing的设计,则到处充满了MVC的痕迹。仔细研究Swing中事件监听、Model-View分离、Renderer/Editor机制、可插拔的LookAndFeel等机制,简直就是一门艺术,充满了美感。而如果你非常痛恨这些设计并觉得他们怪异,很可能你是刚从VB或者Delphi转过来,这些快速开发工具帮助了你也“害”了你。
  
  Swing设计的不错,不过可能过度学术化的设计也使得Swing跑起来并不灵巧,学习难度也大。这客观上确实使得Swing一直没有被广泛使用,而且广受诟病。记得以前“Swing有什么成功的应用吗?”之类的帖子一直是热门话题。IBM等则趁机抓住小辫子弄了SWT吸引了不少人,使得 Java GUI技术面临分裂的危险。
  
  不过随着JAVA的不断升级和优化,Swing的速度一直在提高,美观性也在改善,基于Swing的成功应用也越来越多了。关于Swing是否消亡或被SWT代替或是否能作桌面应用的争论逐渐少了。不过喜欢并精通Swing技术的开发者,尤其在国内,依旧非常少。
  
  好在情况在转好。Sun正意识到Eclipse和SWT所带来的威胁,下了大力气发展NetBeans,其最新版本对Swing GUI可视化设计的支持已经超过了所有对手,其Rich Client框架也走向成熟,这对Swing的发展和应用是一个很大的推动。随着WEB热潮的减退,人们又更多的开始理性的思考B/S和C/S架构的选择,某些领域Swing技术已经成为首选的解决方案。随着JGoodies、JIDE、TWaver等优秀Swing产品的不断涌现,Swing会以更快速度在桌面应用中普及。   回复  更多评论   

# re: 初次感受SWT 2006-11-09 09:34 hhh

看JFace与Swing MVC的M

在JFace的ContentViewer抽象中下面的三个方法反映它对待模型的思路:
  public void setContentProvider(IContentProvidercontentProvider)
  
  public void setInput(Object input)
  
  
  public void setLabelProvider(IBaseLabelProvider labelProvider)
  
  显然setInput是用来配置view背后的数据,从它的参数类型(Object)来讲应该是你的与view无关的领域模型.
  
  从这里就可以看出它和swing的根本差异.swing各种不同viewer(在swing的世界叫JComponent)背后的模型是因不同组件而不同的,模型的接口是反应了该组件特征的.
  如 JTable 背后的TableModel,TableModel接口的定义基本表达了作为一个二维表格期望获得数据的方式如TableModel中有定义这样的方法:
  Objetc getValueAt(int row,int column)
  
  在JFace中直接可以放入Object类型数据,但各种viewer不一样对于拿数据的期望也不一样,
  ContentProvider,LabelProvider解决了上述问题,不同ContentProvider定义了该viewer所期望的拿数据的接口,其实我觉得swing中的model在意义上类似于ContentProvider.
  
  其实感觉JFace的做法在尽量强制你必须构建独立于GUI的模型.
  而swing的话并没有这种侵入性,你可以直接实现viewer的模型接口如
  
  class Mymodel implenents TableModel{
  
  }
  
  也可以定义比较独立的模型然后用对象适配器模式将它们适配到viewer model上!   回复  更多评论   

# re: 初次感受SWT 2006-11-09 09:37 hhh

在灵活性和重用性方面还未见过哪个工业界的GUI库可以与swing比肩。
swing的设计充满了OO的艺术!
有人说从很多角度来看swing都是一件艺术品,swing非常灵活灵活到你可以几乎定制它的每一个方面。
  
  如果你学习 OO,MVC,设计模式。。。,而又想看看实际例子,那么swing正是你要的。  回复  更多评论   

# re: 初次感受SWT 2006-11-09 09:38 hhh

其实我觉得现在swing模拟windows的视感(lookandfeel)已近很接近了.
  这里有swing的各种开源的lookandfeel,有些还是不错的.
  http://www.open-open.com/61.htm
  
  还有swing本身架构没有说swing的外观应该是什么样子的.所以以sun为swing实现的那个默认的lookandfeel来批评swing的样子丑陋是不对的.
  
  swing的组件都是四两拨千斤,模型和绘图都是分离的,如
  JTable 就有TableModel ---->JTable<-----TableUI,从结构来说JTable完全扮演着控制器的角色.从API的使用者角度来说它是一个MVC体系的外观,让人想起了设计模式中的外观模式.   回复  更多评论   

# re: 初次感受SWT 2006-11-09 10:48 不一样

不是不想用swing呀,只是它速度太慢,外观太丑。而SWT相反。  回复  更多评论   

# re: 初次感受SWT 2006-11-09 10:58 hhh

to 不一样

难道你觉得netbeans,Jbuilder,IntelliJ IDEA,永中office...这些都很丑,都特别慢。
且还是有很多 http://www.open-open.com/61.htm 优秀的lookandfeel.

再次强调
swing本身架构没有说swing的外观应该是什么样子的.所以以sun为swing实现的那个默认的lookandfeel来批评swing的样子丑陋是不对的.

在cpu越来越快的年代灵活性和重用性更吸引人!!!  回复  更多评论   

# re: 初次感受SWT 2006-11-09 12:20 何晏成

我并没有否认Swing的重用和灵活性,但是他给我们的速度和外观我想也应该是有目共睹的吧。
“在cpu越来越快的年代灵活性和重用性更吸引人”,大哥,有速度快的更漂亮的的我们为什么不去用呢?而非得要用CPU来拖着一个沉重的包袱呢?
当然,作为软件开发者来说,我们也希望swing在这些方面能取得更大的进步。用一个优秀的包何尝不是一件好事呢?  回复  更多评论   

# re: 初次感受SWT 2006-11-09 12:56 SeamanWang

其实各有有缺点吧,我想这个问题主要应该看你需要用在什么样的应用环境。
  回复  更多评论   

# re: 初次感受SWT 2006-11-09 14:16 hhh

但是他给我们的速度和外观我想也应该是有目共睹的吧。
————————————————————————————
我不知道你用的是jdk那个版本,5.0及以上swing的速度应该还是不赖的,再加上硬件环境也比以前好多了,速度差距很不明显了!当这种差距变得看不见时还有何意义!!!

至于外观还是要我重复这句话:
swing本身架构没有说swing的外观应该是什么样子的.所以以sun为swing实现的那个默认的lookandfeel来批评swing的样子丑陋是不对的.

这里再补充一句,jdk6.0模拟各种os平台的外观已经相当一致了(使用了一些新的方法)。

“在cpu越来越快的年代灵活性和重用性更吸引人”,大哥,有速度快的更漂亮的的我们为什么不去用呢?
————————————————————————————————
问题是我们不仅要速度快,难道灵活性和重用性就不用考虑。我们来看看OO,一个对软件界产生巨大影响的东西,但它有没有使我们的软件速度加快呢?没有!!!应该说反而降低了!!! 他带来的是灵活性和重用性,更强的抽象机制,更好的依赖管理。
所以难道你不会从一个框架的架构设计,API角度去评价一个框架。


  回复  更多评论   

# re: 初次感受SWT 2006-11-09 14:26 hhh

swing是第一个让我有震撼的 GUI库。

当你看了很多MVC,设计模式,OO的很多理论后。当用如powerbuilder,vb,mfc,...这些东西时发现难以表达,因为它们的设计似乎不鼓励模型与视图的分离.感觉他们的设计缺乏一致性!

直到看到swing, 豁然开朗,才感觉一个真正OO的GUI库!  回复  更多评论   

# re: 初次感受SWT 2006-11-09 15:51 温柔一刀

看了半天都是一个人的回复啊  回复  更多评论   

# re: 初次感受SWT 2006-11-09 16:03 hhh

你不也回复了吗?
那你倒是也谈谈啊!  回复  更多评论   

# re: 初次感受SWT 2006-11-09 16:20 hhh

http://www.servasoft.com/zh/index.htm
  ____________________________________________
  这个叫TWaver的东西就是在swing基础上扩展的一套用于电信方面的GUI库.写的非常好,灵活而高效.上面有一个使用TWaver构建的demo.提供了webstart,如果你机器上已近安装了JRE(java 运行环境),那么点那个Launch就可以运行.
  
  国内深入研究swing的人不多,开发TWaver的那帮家伙算NB的!



SWING比SWT速度慢多少呢?
   http://community.csdn.net/Expert/TopicView3.asp?id=5031751
    
    我一直在想如果今天开发eclipse,那些开发者还会不会选择再开发一个GUI库。毕竟当年swing的实现和硬件环境都不尽如人意!!!  回复  更多评论   

# re: 初次感受SWT 2006-11-09 18:08 amp@java

其实SWING的GUI还是有很多问题的,虽然可以让人看起来觉得跟其他窗口没什么区别,但一用起来就觉得区别很大,例如在windows里,选择了一段文字之后点右键,就发现那菜单跟其他程序不一样,有店突兀的感觉。当然,你可以把右键菜单改得跟其他windows程序一样,但到了linux下又不同了。

用一下NetBeans,Oracle JDeveloper,Eclipse,就会发现Eclipse最易用(先不管各自的功能有多强)。SWT的好处还是很多的,java在桌面程序上的失败其实很大部分的原因在于Swing的丑陋。



Look & Feel 并不是表面的东西,而是用户习惯问题,Swing似乎并没有有效地解决这个问题。

我觉得Sun做的产品没有一个好用,呵呵,当然,java本身除外。  回复  更多评论   

# re: 初次感受SWT 2006-11-09 20:37 hhh[匿名]

例如在windows里,选择了一段文字之后点右键,就发现那菜单跟其他程序不一样,有店突兀的感觉。当然,你可以把右键菜单改得跟其他windows程序一样,但到了linux下又不同了。
________________________________________________________
这叫什么?!这是和应用程序相关的吧!!!!!!!!!!!!!!
我的应用程序在某个情况下右击应该弹出些什么,这是有应用程序决定的。为什么怪到类库呢!?
那swt为此作了些什么呢?!

用一下NetBeans,Oracle JDeveloper,Eclipse,就会发现Eclipse最易用(先不管各自的功能有多强)。SWT的好处还是很多的,java在桌面程序上的失败其实很大部分的原因在于Swing的丑陋。
——————————————————————————————————————
实际上这个也和应用程序设计有关,你也可以用swing做出 eclipse一样的风格!

 http://www.swingui.com/index.html swingUI

 http://eos.sourceforge.net/ eclipse on swing

  回复  更多评论   

# re: 初次感受SWT 2006-11-09 20:53 hhh[匿名]

其实swing的目标就是建立一个独立的GUI系统(独立于OS),所以GUI的绘制都是自己实现(建立在java 2D上)。这样带来的好处就是可以抛开历史包袱,从头开始实现一个灵活,现代,面向对象,真正跨平台的 GUI框架。

当初swing设计思想是卓越的,Swing有着无与伦比的扩展性和灵活性,它采用了很多现代的UI理论,如renderer/editor等。只是碍于实现性能。

但随着swing实现的性能越来越高,硬件环境越来越好。swing的发展一定更好!

  回复  更多评论   

# re: 初次感受SWT 2006-11-09 20:57 hhh[匿名]

要说sun对于swing的失败,不是swing设计思想和架构有问题。而是它们为swing实现的默认look & feel是糟糕的!  回复  更多评论   

# SWT人几个特点 2006-12-28 20:59 rehte

我总结了一下喜欢SWT的人几个特点:
1.对于Swing保有很深的偏见,自从Java 2时代用过一段时间Swing后,被当时的Swing折磨透了,这时突然出现了SWT,于是头也不回的进了SWT,从此之后再也没有回头看过一眼Swing。
2.SWT初学者,对于SWT了解越浅越喜欢SWT。SWT程序员有个规律,对于SWT知识了解的越浅,越喜欢SWT,了解越深,越对SWT产生困惑,越知道如何使用SWT的bugzilla,喜欢SWT的程度和学习SWT的时间成反比关系。
3.他们都深信两大谎言:所谓平台一致性和速度快。认为平台一致性提升易用性,认为SWT的速度比Swing快。
4.保守的人倾向与喜欢SWT,不喜欢Swing的灵活性。在Google趋势搜索的结果是喜欢SWT和Eclipse的人基本上都在西欧,尤其以德国最多。喜欢Swing和NetBeans大部分都在美洲,尤其是巴西(跳桑巴舞的地方)。
5.以前可能都使用过MFC和WinForm或者Delphi,很难适应Swing的框架模式。  回复  更多评论   

# re: 初次感受SWT 2007-01-07 13:35 rehte

Swing速度是否真的慢?我怀疑楼主的Java水平,的确Swing水平不高的人很难写出速度快的swing程序来。这不是Swing本身的问题,往往是程序员自身水平的问题,如果你的水平很低的话,学SWT的结果还是一样,这是和Swing和SWT的事件处理模型相关的,不懂它的人往往写的程序很慢。
不信走着瞧。  回复  更多评论   

# re: 初次感受SWT 2007-10-29 19:30 wing5jface

若是SWING速度不慢,早就应有N多的人去用写桌面程序的了,人要面对现实

  回复  更多评论   

# re: 初次感受SWT 2008-11-03 13:25 java的初学者

郁闷!
我竟然在NetBeans IDE 下用SWT的插件!

NetBeans到底是不会支持 SWT的图形化工具,

我学SWT 的本源是SWING 的图形不好看,到java1.6 SWING应该有很大的提升!

  回复  更多评论   

# re: 初次感受SWT[未登录] 2008-11-10 09:27 zz

争来争去有个鸟用,喜欢用啥就用啥,到你发现不能满足你的需要的时候,你就会发现另外一个的好,顺便说一句,swing的漂亮和速度,是要程序员来实现的,你要实在没能力就别用,用swt多好,还省得麻烦,能力不够就别在这乱说  回复  更多评论   



只有注册用户登录后才能发表评论。


网站导航:
 

My Links

Blog Stats

常用链接

留言簿(1)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜