比较AWT和Swing AWT和Swing组件体系 a)Swing通过在父组件上动态调用add()和remove()方法来对组件树进行动态维护因此可以存在没有父组件的子组件 b)SWT通过在构造函数的参数中指定父组件因此不可能存在没有父组件的子组件 AWT和Swing组件绘制 a)Swing通过调用组件的paint()方法来进行组件的绘制组件进一步对他的子组件调用paint()从而完成整棵组件树的绘制通过子类化重写paint()方法可以完全定制一个组件的绘制 b)SWTSWT组件只是本地平台上实际组件的一个代理实际组件采用win编程方式进行绘制绘制的过程不在JVM中完成因此子类化也不能对绘制进行完全定制当SWT组件进行绘制时他在完成了本地的绘制以后会返回JVM然后对所有已注册的PaintListener发出通知因此通过注册PaintListener可以对组件绘制进行一定程度上的修改 AWT和Swing事件模型 a)Swing中的事件会跟据当前的焦点进行发送父组件不能对事件进行过滤Swing中的事件监听器都是有类型的因此每个组件所能支持的事件类型是通过方法名来限定的不能扩展 b)SWT中的事件也是根据当前的焦点进行发送父组件不能对事件进行过滤SWT中支持有类型的监听器也支持无类型的监听器通过addListener(typelistener)我们可以为组件添加任何类型的监听器 AWT和Swing包设计 a)Swing是一个纯粹的组件库他没有图形的操作他的绘制最终转发给Java D来完成 b)SWT包含了组件库和图形库他的结构与AWT比较接近 其它 AWT和SWT实现原理不同AWT控件相当于是一笔一画绣出来的参加 javaawtComponentpaint(Graphics g)性能差而SWT调用了操作系统后台原生库orgeclipseswtwidgetsControl类型中就没有类似的paint方法了但是有一个接口orgeclipseswtgraphicsDrawable实现原理的不同带来了性能和用户视觉的差异 SWING 是基于AWT提供的MVC不完全实现JFACE是基于SWT提供的MVC不完全实现两者的核心作用都是提供了viewer和模型封装的概念从设计实现层面看SWING更加唯美一些JFACE则更加侧重于实用SWING和 JFACE两者都偏重于行为控制上下文而对UI数据(例如一个文本框控件中的内容)的管理都没有做太多的设计JFACE中略有改进提供了 setData的概念JFACE是为了Eclipse而生的虽然后来 RCP出来了又做了其他的包装宣传典型的体现就是提供了JFace Text Framework和其他一些用户构建Eclipse元素的UI支持也提供了一些系统资源管理(ImageRegsitry ResourceManager等)等附加功能 SWING框架与代码很优美但效率低特别是高级控件如各种选择框超慢与Windows本身不协调使用体验差而且再怎么使用LookAndFeel还是不美观总是感觉画的不清晰 |