2013-07-24 31 views
1

我阅读了与事件队列相关的Java文档中的一条声明,声明“注意事件发布到eventQueue可以合并”。这条线的含义是什么?事件如何从事件队列中调度

+1

摇摆漆事件得到“合并”,所以不要做太多重复的绘画。 – morpheus05

回答

2

http://docs.oracle.com/javase/7/docs/api/java/awt/EventQueue.html

事件后

public void postEvent(AWTEvent theEvent) 

帖子一个1.1样式的事件发送到EventQueue。如果在具有相同ID和事件源的队列上存在现有的 事件,则将调用源方法 Component's coalesceEvents

参数:theEvent - 的java.awt.AWTEvent一个实例,或它的 一个子类抛出:NullPointerException - 如果theEvent是null

http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html

coalesceEvents

protected AWTEvent coalesceEvents(AWTEvent existingEvent, 
            AWTEvent newEvent) 

潜在地合并正在发布的事件与现有事件。 如果在队列中找到与要发布的事件具有相同ID的事件(这两个事件 都必须包含此组件作为其源),则此方法由EventQueue.postEvent调用。此方法或者返回 合并事件,该合并事件替换现有事件(然后丢弃新事件 )或null以指示没有合并应为 完成(将第二个事件添加到队列末尾)。事件 参数可能被修改并返回,因为另一个被丢弃 除非返回null

coalesceEvents的这种实现方式合并了两种事件类型: 鼠标移动(和拖动)事件以及绘制(和更新)事件。对于鼠标 移动事件,最后的事件总是返回,导致中间的 移动被丢弃。对于绘画事件,新事件合并到对等体中的复合体RepaintArea中 。新的AWTEvent总是返回 。

参数:existingEvent - 已经在EventQueuenewEvent事件 - 事件被发布到 EventQueue返回:一个已组合的事件,或者null表明 没有凝聚做

+1

AFAIK postEvent clean_up队列中,所有事件都会丢失,并且新事件被触发,这可能是SecondaryLoop(自Java7以来)的原因之一, – mKorbel