SWT和Swing代码的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SWT和Swing代码的区别相关的知识,希望对你有一定的参考价值。

参考技术A

  笔者过去学习过Swing(也算是AWT的增强版吧) 现在开始学习一下 SWT 还没有开始深入 JFace 和 RCP 一步步来吧 先学好基础的 又不用着急做项目用 本文讨论的内容仅限于我已知的 SWT和Swing 范围 希望能对有 Swing 经验的人快速了解 SWT 有所帮助

  第一个不同点就是 SWT 的类库结构不像 Swing 没有单一的父组件 SWT 中有好几个父类

  ◆Widget —— 基本的 SWT GUI 组件(类似于 Java AWT 中的 Component 和 Swing 中的 JComponent) Widget 是一个抽象类

  ◆Control —— 拥有操作系统的对等物的窗口小部件(换句话说 在操作系统中具有同一身份) Control 是一个抽象类

  ◆Composite —— 包含其他控件的控件(类似于 Java AWT 中的 Container 和 Swing 中的 JPanel)

  ◆Item —— 其他控件包含的窗口小部件(该控件可能不是复合控件) 比如列表和表 注意 包含一些项的控件很少包含其他控件 反之亦然 Item 是一个抽象类

  SWT 的组件不能随意继承 其源代码中会标注 IMPORTANT This class is <em>not</em> intended to be subclassed 如果你那样做了 运行的时候 SWT 系统就会报错 也不能任意包含子组件 某些组件 例如 Tree 只能接收 TreeItem 作为其子组件 这样在写一些可重用的图形组件的时候必须注意 Swing 中的写法不能直接套用在 SWT 中

  Swing 的所有图形界面类都继承自 java awt Container 这意味着所有的 Swing 组件都可以包含任意的子组件 也可以被继承 这是两个类库的第一个不同点

  第二个不同点就是 SWT 没有利用 Java 的自带垃圾收集功能来管理对象的销毁   大部分对象都必须调用 dispose() 方可完成资源的释放

  第三个不同点就是在组件的显示上 SWT 抽象了一个 Display 对象来处理 SWT 和操作系统底层组件的通信 资源申请释放 事件循环 任何显示的 SWT 组件必须有且仅有一个 Display 对象

  第四个不同点就是 Swing 的组件实现了 MVC 机制 但是 SWT 没有(目前来看)提供 MVC 机制 也就是说绝大多数 SWT 组件都是不可以更换显示的外观的 我的意思是例如像皮肤这样的机制 例如 实现一个 Office 外观的橙色菜单条的显示 SWT 是不能通过简单的编码来实现的(也许有 但是还没找到相关的资料)

  SWT 的每个组件对象提供了 setData(Object) 这样的方法来给组件存储一个或者多个数据对象 Swing 中没有类似的概念

  第五个不同点就是绝大多数的 SWT 组件创建的时候都必须指定父组件和风格属性 也就是必须有一个 parent 对象 也不能运行的时候动态变更父组件 具体例如 Menu 对象里有 Decorations getParent () 但是并无对应的 setParent() 方法 组件创建之后即自动加入父组件成为其一员 这和 Swing 的必须通过 add() 方法来加入父组件是不一样的 大多数的 SWT 组件不提供无参数的构造器 这就意味这他们不是 JavaBean 这点上 Swing 的绝大多数组件都是 JavaBean

  总结以上这些内容我们可以感觉到 SWT 更像是操作系统本地组件的一种封装 而不是基于 Java OO 的概念对其进行映射 其优点就是数据结构简单

  好了 接下来还是通过一些SWT和Swing的代码来比较吧 第一个是经典的 Hello World

  SWT 版本

  

  import eclipse swt widgets *;

  public class SWTHelloWorld

  public static void main(String[] args) Display display = new Display();Shell shell = new Shell(display);shell setText( Hello World! );shell open();while (!shell isDisposed()) if (!display readAndDispatch())display sleep();display dispose();

  Swing 版本

  

  import javax swing JFrame;

  public class SwingHelloWorld

  public static void main(String[] args) JFrame frame = new JFrame();frame setTitle( Hello World! );frame setDefaultCloseOperation(JFrame DISPOSE_ON_CLOSE);frame setSize( );frame setVisible(true);

  SWT 的 Text 属性在不同的组件中有不同的意思 对于窗体来说它是标题 对于控件来说它是显示的文本 Swing 中这个是分开的 对于窗口来说是 Title 属性 对于控件来说是 Text 属性 SWT 的事件循环基于显式的 while 模式 而 Swing 已经在底层封装好了事件的循环和处理 所以这两段代码最明显的不同就是 SWT 多了时间循环的部分 即文中粗体的部分

  接着我们来看看继承 SWT 的组件会有什么后果 在 Swing 中继承一个组件然后向其中添加子组件 例如建立一个自定义的工具栏 然后向其中加入子栏目 并最后显示出来 这是经常进行的操作 再看看 SWT 中

  

  import eclipse swt widgets Display;import eclipse swt widgets Shell;import eclipse swt widgets ToolItem;import eclipse swt SWT;

  public class NewToolBar extends eclipse swt widgets ToolBar

  public static void main(String[] args) try Display display = Display getDefault();Shell shell = new Shell(display);new NewToolBar(shell SWT NULL);

  shell open();while (!shell isDisposed()) if (!display readAndDispatch())display sleep(); catch (Exception e) e printStackTrace();

  public NewToolBar(Shell parent int style) super(parent style);new ToolItem(this SWT NULL);

  

lishixinzhi/Article/program/Java/hx/201311/26347

Java ——对SwingAWT和SWT的认识

对Swing、AWT和SWT的认识

摘要:现在java提供了除swing之外的图形GUI开发工具,那么他们之间有什么区别呢?本文主要分析了Swing,AWT和SWT他们之间的区别。

  1、 三者的概述:

  AWT(Abstract Window Toolkit) 是 API为Java 程序提供的建立图形用户界面GUI (Graphics User Interface)工具集,基于一个对等体实现的。AWT可用于Java的applet和applications中。它支持图形用户界面编程的功能包括: 用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。

  SWT("Standard Widget Toolkit",是一个最初由IBM开发的工具包,现在由Eclipse基金会维护。)是一个独立于平台的,也是基于一个对等体实现的,可以脱离 Eclipse 框架单独使用的图形组件,用JNI技术提供与本机系统同样的用户界面组件的观感,较好的运行效率,稳定的平台表现。一个SWT应用程序的基本组成部分为显示界面(Display)、命令界面(Shell,使命令进入并使运行初始化)和窗口部件(Widgets)。Display负责管理事件循环和控制UI线程和其他线程之间的通讯。Shell是应用程序中被操作系统窗口管理器管理的窗口。每个SWT应用程序至少需要一个Display和大于等于1个的Shell实例。

  Swing是基于AWT的架构之上的,在不改变大量的程序代码前提下允许程序中每个组件观感的变化。支持可更换观感技术的引入允许Swing组件在模拟原生组件外观的同时又保持了平台独立的优点。

  2、 三者的区别

  AWT、SWTt都依赖底层平台,都基于对等体实现的,在不同的操作系统上开发出来的程序显示效果不一样,SWT提供比AWT更为丰富的组件集;而Swing对底层平台的依赖很少,所以给不同用户一致的感觉,还拥有一个丰富、便捷的用户界面元素集合。由于AWT和SWT都持有对本地组件的引用,它们必须以正确的方式释放这些引用以避免内存泄露和JVM崩溃。AWT将绝大多数资源管理任务交给系统,不过这使得AWT的实现复杂化了。一旦它实现了,开发者很少有机会犯错误并使他们的程序崩溃。而SWT是采用另外的方法,它有一条法则就是:谁创建,谁释放。因此开发者必须谨慎地显式调用dispose方法释放每一个由他创建的组件和资源。这虽然简化了SWT的实现模型,但把开发者摆在了因错误编码而易于造成程序崩溃这一风险之上。

  awt只提供所以操作系统都有的控件,即全部调用的是本地操作系统的控件;Swing只是窗口和框架等的顶层的组件调用操作系统控件,大部分都是使用java代码来模拟的;swt大部分是用的本地操作系统的控件,有些在别的操作系统的控件要经过自己的绘制。Swing和SWT都在实现上都使用模拟。SWT是模拟平台上缺失的组件。区别是SWT的模拟更像是AWT的Canvas实现的模拟。SWT的Composite类有它自己在操作系统中相应的对等体。它从自己的对等体中获得所有它所需要的资源如图形处理的对象,字体和颜色等。它直接从操作系统获取所有的事件并进行处理。然而,Swing组件在操作系统中没有相应的对等体。它只是一块顶层容器中的逻辑区域,实际上它从顶层容器的对等体中借用资源。Swing的事件并不是底层系统产生的事件。它们实际是由顶层容器处理AWT事件所产生的伪事件。另一个不同之处是Swing组件的z-order系统是来自于AWT组件的。Swing是基于awt的架构之上的,故Swing组件与顶层AWT容器共享一个对等体。因此,Swing组件也和顶层容器有相同的z-order。SWT和AWT组件都有不同于顶层容器的z-order,通常是高于顶层容器。故而如果AWT组件和Swing组件混合在一起的话,Swing组件将可能被AWT组件遮住。当操作系统开始更新UI的时候,顶层容器和Swing组件总是先于AWT组件绘制。当它们完成绘制,AWT组件会覆盖Swing可能绘制过的地方。因此不提倡Swing和AWT组件的混用。如果有一个浮动的Swing组件如菜单,AWT组件很可能遮盖菜单。


本文出自 “Mr_Computer” 博客,请务必保留此出处http://caochun.blog.51cto.com/4497308/1751064

以上是关于SWT和Swing代码的区别的主要内容,如果未能解决你的问题,请参考以下文章

斐乐swt和fwt区别

java中SWT是否已经过时了,没有swing好用哦?

JFace和SWT有啥区别

java中awt与swt的区别是啥?

插件项目的 SWT 或 Swing

使用JAVAFX和SWING有啥区别[重复]