转载自[url]http://blog.sina.com.cn/swingjava [/url]
Swing通过AWT的事件循环系统来推动整个系统的运行,这个AWT的事件系统就是Swing系统的这个“第一推动力”。
不像一般GUI系统事件循环是由单个线程完成的,Swing事件循环实际上存在两个线程。具体到Windows上来说,一个线程叫AWT- Windows,它负责从操作系统获取底层事件,并将事件处理后翻译成Swing能懂的事件,并放入到Swing的系统事件队列(EventQueue) 中;另一个线程叫EventQueue-0,该线程就是所谓的EDT(Event Dispatch Thread),它负责从事件队列中获取事件,并分派到Swing组件中,最终产生有意义的动作事件传递给组件事件处理器。有时EDT还负责将事件队列中的事件进行预处理,比如多个连续的Paint事件合并成一个等等。下图是Swing事件处理系统的示意图:
和一般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的第一推动力。
分享到:
相关推荐
Swing第*刀(转) 觉得很好,发给大家看看,不需要分
《Java.Swing第二版》是Java开发者不可或缺的经典教程,它深入浅出地讲解了Java Swing库的使用,帮助程序员创建美观且功能丰富的图形用户界面(GUI)。Swing是Java Foundation Classes (JFC)的一部分,提供了丰富的...
主题:Swing第二刀:枝间新绿一重重 http://www.iteye.com/topic/707540 主题:Swing第二小刀刀:星星之火可以燎原 http://www.iteye.com/topic/707514 Swing第三刀:做套ERP,要配得上我的登录界面! ...
Swing 包是 JFC 的一部分,由许多包组成,例如 javax.swing、javax.swing.plaf、javax.swing.border 等。 Swing 的应用 Swing 广泛应用于 Java 的 GUI 开发,例如创建复杂的 GUI 界面、实现跨平台的 GUI 应用程序...
swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3...
《Java Swing(第二版)》是一本专注于Java GUI编程的经典著作,主要讲解了如何使用Swing库来构建功能丰富的桌面应用程序。Swing是Java平台上用于创建用户界面的主要工具包,它提供了许多组件、布局管理器以及事件处理...
文件名列表中的"swing第一刀.doc、swing第三刀.doc、swing第二刀.doc、swing第四刀.doc"可能包含了一系列教程或示例,指导读者如何利用Swing的特性。这些文档可能涵盖了从基本组件的使用到高级主题,如布局管理、...
Swing计算器是一款基于Java Swing库开发的简单计算工具。Swing是Java的一种图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分,主要用于构建桌面应用程序。本项目的核心在于利用Swing组件来...
在Java Swing的第二版中,通常会涵盖更多的高级特性和最佳实践,以便开发者能够更有效地利用这一强大的工具。 Swing是Java AWT(Abstract Window Toolkit)的扩展,它用纯Java实现,因此具有跨平台的特性。Swing...
Swing提供了一系列组件,如按钮、文本框、菜单等,允许开发者构建功能丰富的、具有吸引力的用户界面。 在“Java Swing漂亮界面 超酷 JavaSwing教程”中,我们主要会探讨如何利用Swing来设计美观且用户友好的界面。...
在Java Swing第二版中,涵盖了更深入的Swing组件使用、布局管理、事件处理以及自定义组件等内容。这本书的源码提供给读者实践和探索Swing API的机会。 1. **Swing组件**:Swing提供了许多组件,如JButton、JLabel、...
1. **加载自定义LookAndFeel**: 首先,你需要创建一个实现LookAndFeel接口的新类,或者从已有的LookAndFeel类(如 javax.swing.plaf.LookAndFeel)派生。然后,你可以覆盖其方法以实现自己的绘图逻辑。 2. **注册...
Java Swing 是Java编程语言中用于构建桌面应用程序用户界面的一个库,它是Java Foundation Classes (JFC) 的一部分。Swing 提供了一系列组件,如按钮、文本框、菜单等,用于创建功能丰富的图形用户界面(GUI)。在...
Swing是Java编程语言中用于构建图形用户界面(GUI)的一个强大的工具包,它是Java Foundation Classes (JFC)的一部分。Swing提供了丰富的组件库,包括按钮、文本框、菜单、滚动面板等,允许开发者创建功能完备且具有...
Swing桌面应用开发学习
总之,"Substance 6.1 Swing 皮肤包"为Java Swing开发者提供了一个强大的工具,通过它,开发者可以快速地改变应用的视觉风格,创造出独特的用户界面,提升应用的吸引力和专业感。有了源码和必要的依赖,开发者可以...
1. **Swing组件**: Swing包含了一系列组件,如JButton、JLabel、JTextField、JTable、JTree等,它们是构建用户界面的基础。每个组件都有其特定的功能和用法,比如JButton用于创建按钮,JTable用于显示表格数据,...
总之,“javaSwing皮肤大全.rar”是一个宝贵的资源,它提供了丰富的Java Swing Look and Feel皮肤,可以帮助开发者快速地为他们的Swing应用程序赋予独特的视觉风格,提高软件的吸引力和用户满意度。通过合理利用这些...
Swing是Java编程语言中的一个图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分。Swing提供了一套丰富的组件,用于创建桌面应用程序,包括按钮、文本框、菜单、滚动面板等。Swing是完全由Java...