Java + Swing:编写代码以合并更改事件

Jas*_*n S 6 java swing event-queue

我有这个数据流,粗略地说:

DataGenerator -> DataFormatter -> UI
Run Code Online (Sandbox Code Playgroud)

DataGenerator可以快速生成数据; DataFormatter可以将其格式化以用于显示目的; UI只是一堆Swing元素.

我想让我的DataGenerator像这样:

class DataGenerator
{
   final private PropertyChangeSupport pcs;
   ...
   public void addPropertyChangeListener(PropertyChangeListener pcl) {
     this.pcs.addPropertyChangeListener(pcl); 
   }
   public void removePropertyChangeListener(PropertyChangeListener pcl) {
     this.pcs.removePropertyChangeListener(pcl);
   }
}
Run Code Online (Sandbox Code Playgroud)

this.pcs.firePropertyChange(...)只要我的数据生成器有新数据就调用; 然后,我可以做dataGenerator.addPropertyListener(listener)在那里listener负责推动变化着的DataFormatter,然后到用户界面.

这种方法的问题在于,每秒有数千个dataGenerator更改(根据我的情况,每秒10,000到60,000之间),并且为UI格式化它的计算成本足够高,它会给我带来不必要的负担中央处理器; 我真正关心的是每秒最多10-20次变化.

有没有办法使用类似的方法,但在变更事件到达DataFormatter之前合并它们?如果我收到关于单个主题的多个更新事件,我只关心显示最新的事件,并且可以跳过所有以前的事件.

Hau*_*idt 5

两个想法:

  • 总结PropertyChangeEvent秒。仅当最后一个事件在50毫秒之前(或任何合适的时间)被触发时,才扩展PropertyChangeSupport,覆盖public void firePropertyChange(PropertyChangeEvent evt),触发。(实际上,您应该覆盖每种fire*方法,或者至少覆盖您在方案中使用的方法,以防止创建PropertyChangeEvent。)
  • 删除基于整个事件的方法。每秒60.000个事件是一个很高的数字。在这种情况下,我会进行投票。这是对MVP的概念更改,演示者可以知道它是否处于活动状态并应进行轮询。使用这种方法,您不会生成成千上万的无用事件。您甚至可以每秒显示最高的帧数,无论有多少数据。或者,您可以将演示者设置为固定速率,让其在两次刷新之间休眠一段时间,或者使其适应其他情况(例如CPU负载)。

我倾向于第二种方法。

  • 刚刚发布了有关此主题的[有趣的博客条目](http://weblogs.java.net/blog/carcassi/archive/2012/02/15/dealing-real-time-data-uis-and-others) 。 (3认同)