`
eneve520
  • 浏览: 56671 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Swing的第一推动力(转)

 
阅读更多

春节前写了一系列文章概要介绍了Swing的体系框架,至此,Swing框架就已经完全搭建了起来。但目前还缺少Swing与底层事件系统的交互。Swing通过AWT的事件循环系统来推动整个系统的运行,这个AWT的事件系统就是Swing系统的这个“第一推动力”。

    不像一般GUI系统事件循环是由单个线程完成的,Swing事件循环实际上存在两个线程。具体到Windows上来说,一个线程叫AWT-Windows,它负责从操作系统获取底层事件,并将事件处理后翻译成Swing能懂的事件,并放入到Swing的系统事件队列(EventQueue)中;另一个线程叫EventQueue-0,该线程就是所谓的EDT(Event Dispatch Thread),它负责从事件队列中获取事件,并分派到Swing组件中,最终产生有意义的动作事件传递给组件事件处理器。有时EDT还负责将事件队列中的事件进行预处理,比如多个连续的Paint事件合并成一个等等。下图是Swing事件处理系统的示意图:

http://s4.sinaimg.cn/orignal/4b6047bcfae1b09dc5033

    和一般GUI工具系统不同,Swing的这种双事件处理线程有其设计目的。总的来说这种事件处理线程模型增加了Swing图形系统的灵活性和可扩展性,为Swing实现高级的功能预留下了扩展空间。

    Swing著名的"灰框(gray rect)"问题就是利用这种巧妙结构实现的。单单就EDT的模型来说,Swing存在普通GUI系统常见的线程占用问题。所谓的"灰框"问题是指,某些Swing程序由于编写较差,将长时间任务放在EDT上进行。如果此时恰巧有一个窗口遮住了Swing程序,当用户移开覆盖窗口时,由于任务阻塞了EDT,使Paint事件得不到及时处理,造成Swing界面出现灰色方框的现象。

    JDK 1.6采用了如下方法解决了这个问题:当被遮挡的窗口被暴露时,AWT-Windows线程获得到了这个EXPOSE事件,在将事件翻译成Paint事件给事件队列之前,AWT-Windows先从操作系统的图形缓冲里获取窗口被遮挡前的图像(注意某些Linux图形系统并不支持这种缓冲,所以Swing在某些Linux系统上并没有解决这个问题),然后将这个图像采用bltbit的方法画在暴露出的灰框上,然后才把Paint事件发送给Swing事件队列。这儿的关键就在于获取底层事件的线程AWT-Windows同Swing的EDT不是一个线程,因此EDT虽然被长时间任务阻塞了,但是AWT-Windows这个线程并没有被阻塞。因此可以及时的处理窗口暴露事件,避免了灰框问题。

    由于Swing程序在被别的窗口遮住时,其状态可能已经发生了变化,因此bltbit缓冲的图像往往同当前的窗口状态不能同步。如果你留心观察就会发现这个现象:窗口被移开的瞬间,虽然没有问题,但是图像是被遮盖前的,之后不久窗口会发生突然的变化,将当前正确的窗口画出来。这时的更新是Swing程序在完成了长时间任务后,处理Paint事件重画当前窗口造成的。

    其实这种双线程结构还有许多其他的应用。Java2D性能的大幅度提高,其中就利用了这种双线程结构。EDT在处理多个Graphics2D原子动作事件时,先进行了合理的预处理,比如动作合并,动作数据集成,批处理模式的发送给图形卡等等。

    Swing的问题问题从本质上来说任何图形系统都会存在。不知你听说过SWT对应的白框问题没有,这个问题和Swing的在本质上是一样的,只是SWT窗口缺省的背景是白色。SWT由于其单线程事件处理模型,就很难解决这个问题。

    同样在Solaris和Linux,Swing的事件处理线程都是两个,只不过其他平台上叫AWT-Solaris或者AWT-Linux线程罢了。有了这些AWT-xxx事件循环线程对Swing事件队列提供的原始动力,整个Swing机器就开始了运转。这就是Swing的第一推动力。

 

--http://blog.sina.com.cn/s/blog_4b6047bc0100088h.html

分享到:
评论

相关推荐

    The Swing CMS Engine-开源

    这一特性使得Swing CMS Engine在视觉呈现上更具吸引力,满足了现代互联网用户对于视觉体验的需求。 开源软件的特性赋予了Swing CMS Engine持续进化的能力。通过社区的共同努力,系统不断得到优化和更新,错误被修复...

    BitingDeath:Java 中的僵尸游戏。 领导一个团队,清理垃圾,点击“第二天”按钮。 模型和 Swing 实现

    然而,为了使游戏对普通玩家更具吸引力,需要结合Swing库来构建一个用户友好的图形用户界面(GUI)。 Swing是Java提供的一个用于创建桌面应用程序的UI工具包,它包含了一系列组件,如按钮、文本框、面板等,使得...

    javaeye月刊2008年5月 总第3期.pdf

    - dotCMS是一个Java内容管理系统,它为Mambo、Joomla和Drupal等用户提供了一种替代方案,展现了Java在内容管理领域的竞争力。 15. **Jason Lee:JavaOne 2008全记录**: - Jason Lee的记录继续提供了关于JavaOne的...

    oyoaha lookandfeel-开源

    在默认情况下,Swing应用通常采用系统默认的LookAndFeel,但通过第三方库如"oyoaha lookandfeel",开发者可以自定义更加吸引人的界面设计,提升用户体验。 "oyoaha lookandfeel"的特点在于其提供的主题、动画、声音...

    1.1.1 Java语言诞生与发展.pptx

    然而,随着互联网的崛起,OAK在1994年被重新定位,应用于WEB开发,诞生了HotJava的第一个版本。1995年,SUN公司正式推出了Java,并迅速引发了全球性的关注和广泛应用。 Java语言的发展历程中,关键的里程碑包括1996...

    几种富客户端开发技术参照.pdf

    4. **Java SWT**:Java已经支持窗体用户界面的开发,除了Java基础类库JFC/Swing,开发人员还可以使用Eclipse Project的SWT工具箱和其他第三方工具。SWT提供更接近原生系统的用户体验,但相比其他技术,可能在跨平台...

    jriaffe-开源

    综上所述,Jriaffe是一个基于Java和Groovy的开源RIA框架,它通过在Swing上添加一层抽象,简化了桌面应用的开发流程。开源性质使得Jriaffe对开发者更具吸引力,他们可以自由地利用这个框架进行创新和改进。同时,提供...

    完整版core java的课程体系 Java基础入门课件 java编程教程 共353页.ppt

    - **开始学习Java**:了解如何安装和配置Java开发环境,以及编写和运行第一个Java程序。 - **标识符、关键字和类型**:学习如何定义变量、常量,理解各种数据类型,包括基本类型和引用类型。 - **表达式和流程...

    Java发展史概述

    Java的第一个版本,JDK 1.0,于1996年发布,引入了面向对象编程的概念,包括类、接口和异常处理等核心特性。随后的JDK 1.1在1997年增加了枚举、内部类和JNI(Java Native Interface),进一步完善了平台。 2000年,...

    Zaval GUI Designer Package-开源

    通常,版本号表示软件的成熟度和改进程度,1.0.0表示这是该软件的第一个主要版本,可能包含了基本功能并可供公众使用。随着开发的推进,可能会发布更高版本的GDP,包含更多的特性、优化和错误修复。 总结来说,...

    java和C/C++第六届蓝桥杯大赛个人赛省赛(软件类)真题

    蓝桥杯大赛,全称为“全国软件和信息技术专业人才大赛”,是一项旨在推动我国软件和信息技术专业人才培养的重要赛事。自举办以来,吸引了众多高校学子参赛,其中Java和C/C++是两大主流编程语言,尤其在软件类竞赛中...

    The Platonos Project-开源

    Swing作为Java的标准库之一,提供了丰富的组件和布局管理器,但Platonos框架则进一步优化了这些功能,使得开发者能够更轻松地创建出美观、交互性强的桌面应用。框架的易用性和灵活性,降低了开发者的入门门槛,同时...

    EyeTracker:使用eye部落的眼动追踪工具

    **EyeTracker: 使用eye部落的眼动追踪工具** 眼动追踪技术是一种先进的生物识别技术,它通过检测人眼的运动...总的来说,EyeTracker是一个强大的工具,可以帮助我们深入理解人类视觉行为,推动相关领域的研究和发展。

    mvc4h-开源

    Swing是Java的一个组件库,用于构建桌面应用程序,而Web服务的集成则意味着开发者将能够利用mvc4h构建RESTful API,实现服务器端与客户端之间的通信。 【标签】"开源软件"表明mvc4h遵循开放源代码的原则,允许任何...

    学习JAVA的30个目标

    掌握JAVA语言的基础知识是学习JAVA的第一步,这包括变量、数据类型、控制结构等基本概念。此外,熟练运用JAVA的核心类库,如集合框架(Collections)、序列化(Serialization)、流(Streams)、网络编程...

    trading101:目标是创建一个开源交易平台,以帮助像我这样的股票市场爱好者

    1. **用户界面设计**:用户界面(UI)是与用户交互的第一层,必须直观且易于理解。使用JavaFX或者Swing可以创建Java应用程序的图形用户界面,提供图表、数据表和交易按钮等功能。 2. **实时数据流**:股票交易平台...

    角色扮演游戏:角色扮演游戏RPG游戏语言Java

    1. **游戏角色和属性**:角色拥有各种属性,如生命值、攻击力、防御力等,这些属性可以通过类和对象的概念在Java中实现。每个角色都是一个独立的对象,具有特定的行为和状态。 2. **游戏世界和地图**:游戏世界的...

Global site tag (gtag.js) - Google Analytics