`
chengzhi_hong
  • 浏览: 168302 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SWT_AWT_Swing事件处理机制

    博客分类:
  • J2SE
阅读更多

总的来说Swing/AWTSWT在事件处理机制上是类似的,窗口组件的树状结构也是类似的。图形用户界面系统在事件处理设计上有两大类,一类是单线程模型,一类是多线程模型。在事件处理机制上,三者都是遵循单线程规则。
                                                                                                                 
        
单线成模型对于事件处理不保证线程安全性(Thread Safety),所有的事件处理都在Event Dispatch Thread(EDT)上进行,此一类事件模型通常叫做单线程模型。这种模型规定所有对组件的访问操作必须在EDT上完成。为什么对于组件的访问需要在EDT上完成?这主要是为了保证对于组件状态的改变是同步的,保证了界面组件的可确定性。这中模型是大部分图形用户界面工具采用的模型,包括Swing/AWTSWTGTKWinForm等等。

         这种模型的好处是,结构设计和代码实现都比较简单,避免了为了实现线程同步的复杂处理。但是也带来了一些问题,最常见的问题是,程序员容易将长时间复杂任务的处理放在事件处理函数完成,造成EDT线程被阻塞,给用户造成界面失去响应的错觉。

     其实人们对于Swing速度慢和反映迟钝的感觉大部分来源于此,简单的说,是程序员的问题,而不是Swing自身的问题,是因为程序员没有理解这种事件处理机制造成的。其实在SWTGTKWinForm等任何以这种事件模型为基础的工具都会出现。重现的方法就是你简单的将长时间处理的任务放在事件处理函数中,你的用户界面就会失去响应。

         如何解决这种问题?通用的办法就是采用异步线程处理长时间任务。但是还要记住的是,在这种任务中对于界面的更新要采用SwingUtilities.invokeLater或者在SWT采用Synchronize方法,将访问操作放到EDT上进行。关于如何写一个有效处理长时间任务的Swing程序,将会在其他文章中描述。

         多线程模型中,所有的事件处理都是在异步线程中进行,界面组件同步访问的操作需要程序员来保证。这种模型设计本身很复杂,而且对于程序员来说要求比较高,必须对线程同步编程很熟悉,而且花在同步上的操作影响了平台的性能。一般现在的图形界面工具都不再采用这种方式。

         下面比较一下Swing/AWT/SWTAPIGUI特征以及实现方法的不同。

         API上,SwingAWT是兼容的,SWT是单独的一套接口。

1.Swing/AWT的组件在生成时可以脱离父组件独立存在,SWT必须有父组件存在。这主要是由于SWT的资源是自己管理,SWT程序必须负责释放不用的资源,为了避免这种释放资源的重复性,SWT父组件被设计成在析构时自动递归调用子组件的析构函数。

2.Swing/AWT的资源回收由垃圾收集器负责,SWT必须由SWT程序显式释放。

3.Swing/AWT的事件线程循环不需要程序员显式启动,SWT必须要程序员来显式启动。

         Swing/AWTSWT在布局管理器上是类似的,没有太大区别。

         GUI特征上,有两个比较层面,一个是组件种类,一个是组件本身特征。在理解这些特征时,一定要牢牢记住这样一个准则:Java是平台无关的语言,因此它对应用程序所提供的API一定要各个平台都相同,GUI特征其实也是API,所以GUI的特征必须在各个平台都相同。

         组件类型上,AWT采用的是最小公约数方法,而Swing/SWT采用的是最大公倍数方法。简单的说AWT是各个平台所有组件集合的交集,而SwingSWT则是各个平台组件的并集。下图所示,假设操作系统平台OS1上提供组件{C1, C2, C3, C4, C7},而OS2提供{C1, C2,C3, C4, C6}OS3提供{C1, C2, C3, C4, C5},那么其中的阴影部分就是AWT所实现的组件,由于C5C6C7是各个平台所特有的,因此AWT中就不包含这些组件。比如TableTreeJava支持某些操作系统平台中不包含,所以在AWT中就没有TableTree。由于AWT的组件太贫乏,所以AWT在现在复杂应用程序几乎没有什么用。SwingSWT提供的组件是各平台所有组件的并集,这样就解决AWT的组件贫乏的缺陷。也就是说,SwingSWT提供的组件包括C1C7的所有组件,而AWT只提供C1C4的所有组件。

 

         从组件本身的特征来看,SWTAWT采用了相同的策略,即最小公约数,而Swing采用的是最大公倍数。如下图所示,假设对于同一个组件C,如果它在OS1上提供的特征包括{a,b,c,d,e},而OS2上提供的特征包括{a,b,c},而OS3包括的特征有{a,b,c,d},那么SWTAWT提供的组件特征只包括{a,b,c},而Swing的包含的平台特征包括{a, b, c, d, e}。比如由于Solaris平台上的按钮不提供对于图标的支持,所以SWTAWT的独立按钮就不提供对于按钮图标的支持,而Swing提供按钮图标的支持。

         在实现方法上,AWT采用Java+Native C Peer(一种JNI调用)方法,SWT根据各平台的不同情况,一部分组件使用Java+Java Peer+JNI Wrapper,一部分采用Java模拟的方法,而Swing则采用所有组件都纯粹Java模拟的方法。

                    AWT的接口和各操作系统组件之间的差别采用Native C Peer实现的方法来填平,下面是它的结构示意图:

           其中AWT Native Peer Impl部分都是C语言写的,在各种操作系统上是不同的,但是它们和AWT Component组件之间的AWT-Peer JNI调用接口是不变的,AWT ComponentJava代码实现在各个平台上都是相同的,最后AWT ComponentApplication提供同一的API接口。

           SWTAWT不同,它在Native Component上进行了一层薄薄的JNI封装,所有操作系统的API调用都被映射到一个JNI调用上,然后SWT通过Java代码组合这些JNI调用实现同一的API,下面是其结构示意图:

         因此SWTJava代码实现部分在各个平台是不同的,它的C代码部分即JNI Wrapper部分只是一个各平台GUI APIJNI简单映射,SWT通过Java Peer在各平台的不同实现填平了各平台差异,从而给Application提供同一的API接口。当然SWT对于某种平台上缺少的组件采用的方法和Swing基本类似。

         Swing和上两中方式完全不同,它直接调用Java2D,抛弃了本地操作系统平台组件的实现,完全自己画出来了整个组件,当然Java2D底层也是调用平台的图形系统。下面是它的示意图:

         当然Swing是建立在AWT基础上的,对于一些顶层容器类如Frame / Dialog / Window以及Applet是直接采用AWT的,这儿为了方便并没有画出。由于Java2D API是个平台无关的,因此SwingJava实现代码在个平台都是一样的,都是一套,当然除了与SwingLook And Feel相关的东西以外。

         由于篇幅原因,今天就先谈到这儿,至于这三种不同架构、实现会对它们的性能和外观以及编程难度产生什么影响,我们以后的文章逐渐讨论。

分享到:
评论

相关推荐

    JAVA_SWT_TEST.rar_SWT_WIDGET_awt_java swt_java 工具箱

    标准窗口小部件工具箱的 Java 二维作图 SWT (标准窗口小部件工具箱,Standard Widget Toolkit)是在 Eclipse 平台上使用的窗口...它也可以作为 Swing/AWT 的一个重要替代产品,用于构建任何类型的 Java GUI 应用程序。

    SWT_全接触 SWT_全接触 SWT_全接触

    3. **消息循环**:SWT使用了类似Windows的消息循环机制,而不是Swing中的事件分发线程。通过不断地读取消息并分发处理,维持窗口的响应状态。 ### 结论 SWT作为一款强大的GUI组件库,对于那些希望在Java应用程序中...

    浅析Java中Swing与SWT和AWT的区别及实现_王亚南

    AWT提供了窗口、按钮、文本框等基本的GUI组件,以及事件处理机制。由于其依赖于底层的本地系统,因此在不同操作系统上可能会有不同的表现和性能。 接着,Swing是继AWT之后出现的另一种GUI工具包。Swing在AWT的基础...

    swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位

    此外,SWT还支持事件处理、布局管理以及对话框等特性,使得开发者可以方便地构建复杂的用户界面。 为了在64位Java环境中使用这个库,开发人员需要确保他们的Java开发环境(JDK)也是64位的,因为32位的JDK无法识别...

    如何在SWT中使用AWT、SWING组件

    SWING使用JavaBeans组件模型,支持事件处理,且内置了大量的可定制组件,如JTable、JTree等。 **在SWT中使用AWT组件** 在SWT中使用AWT组件,你需要依赖`org.eclipse.swt.awt`包。通过` SWT_AWT`桥接类,可以将AWT...

    swt swing awt的区别

    swt swing awt的区别

    swt.zip_SWT_swing

    swt 界面设计SWT(Standard Widget Toolkit) Standard Widget Toolkit是一个开源的GUI编程框架,与AWT/Swing有相似的用处,著名的开源IDE-eclipse就是用SWT开发的。 在SWT之前,Sun已经提供了一个跨平台GUI开发工具包...

    java_record_codes.rar_SWT_java record_java swt_java 屏幕录像

    SWT是Java平台上的一种GUI工具包,与Java的Abstract Window Toolkit (AWT)和Swing不同,SWT直接与操作系统底层交互,因此它的性能通常优于AWT和Swing,尤其是在窗口外观和感觉上。对于屏幕录像应用来说,性能和与...

    SWT_3.8_64位_windows.zip

    1. swt.jar:这是SWT的核心库,包含了所有用于构建GUI的基础组件、布局管理器和事件处理机制。开发者可以通过这个库创建各种按钮、文本框、列表、树等控件,并实现与用户的交互。 2. swt-debug.jar:这是一个附加的...

    swt.rar_SWT_swt API SRC_swt api download

    这个文档详细解释了SWT库中的各个组件、布局管理器、事件处理机制以及如何使用它们来构建用户界面。 在"www.pudn.com.txt"可能是一个下载链接或者相关信息的文本文件,通常这样的文件可能会包含更多关于SWT资源的...

    SWT_JFace_in_action_jface_action_

    JFace则是在SWT之上的一层抽象,它旨在提供一种更高级别的、面向对象的API,简化了事件处理和数据绑定。JFace通过提供视图、控制器和模型的结构,帮助开发者遵循MVC(Model-View-Controller)设计模式,从而使得代码...

    Eclipse_Swt_Jface_核心应用

    2. JFace入门:讲解JFace的视图、编辑器、对话框和表单的创建,以及数据模型和事件驱动机制。 3. 数据绑定:演示如何使用JFace的数据绑定功能,将数据模型与用户界面元素关联起来,实现双向数据同步。 4. 表格和树...

    SWT_API

    SWT是一个开放源码的库,由Eclipse基金会维护,它允许开发者创建原生的、高性能的GUI应用,与Java的AWT和Swing组件相比,SWT提供了更接近操作系统原生外观和感觉的控件。 标题"SWT_API"表明这是一个关于SWT API的...

    SWT_JFace_In_Action

    6. 事件和监听器:理解和使用事件处理机制。 7. 插件开发基础:了解Eclipse插件的结构和开发环境。 8. 扩展点和声明:如何定义和使用Eclipse的扩展点。 9. 集成开发:在现有Eclipse环境中集成自定义功能。 10. 测试...

    SWT Swing与AWT区别

    此外,AWT的布局管理器和事件处理也相对基础,如FlowLayout、GridLayout、BorderLayout等,以及ActionEvent、MouseEvent等基础事件。 **Swing** Swing是在AWT基础上发展起来的,它是一个完全由Java实现的、可移植的...

    java-swt-student.rar_FrmServer java_SWT_dataoperate.java_java

    这些交互操作都需要在SWT的事件处理机制下实现。 除了基本的用户界面和数据库操作,这个系统可能还涉及到了数据验证、错误处理、日志记录等方面的功能。数据验证确保输入的信息符合规定格式,防止无效数据进入系统...

    图形界面开发--AWT,Swing,SWT

    事件处理机制允许开发者编写代码来响应这些事件。 #### 18.2 Applet开发 **18.2.1 Applet的HelloWorld开发** Applet是一种特殊类型的Java程序,可以在Web浏览器中运行。最早的Applet开发是简单的“Hello World”...

    SWT_JFace.rar_swt/jface

    然后,逐步深入到数据绑定、事件处理和视图设计。在"第二篇 SWT_JFace篇(6-16章)"中,可能涵盖了这些主题的详细讲解,包括: - SWT组件的使用:如何创建和配置控件,以及如何响应用户的操作。 - JFace的数据绑定:...

    java 图形界面 java awt swt swing gui

    AWT包含基本的组件,如按钮、文本框、标签等,以及事件处理机制。然而,由于AWT依赖于本地平台,它的跨平台兼容性有时会受到限制,并且在某些平台上可能无法达到最佳的性能和外观。 2. Swing: Swing是建立在AWT之...

Global site tag (gtag.js) - Google Analytics