【问题标题】:jgoodies bindings + coalescing frequent changesjgoodies 绑定 + 合并频繁更改
【发布时间】:2010-10-12 16:44:38
【问题描述】:

我有一个 Java 应用程序,它以可变速率更新数据(从我无法控制的相当高速的数据流接收,但最高 120Kbytes/sec),我想显示像字节数这样的统计数据/packets 收到,使用一个对话框。

我正在调查JGoodies bindings,并初步了解以低速率接收的人工数据。

我想做的大概是:

  1. 制作一个类似这样的 bean 类:

    public class Statistics
    {
      private int bytes;
      private int goodPackets;
      private int badPackets;
      private int totalPackets;
    
      public int getBytes() { return bytes; }
      public int getGoodPackets() { return goodPackets; }
      public int getBadPackets() { return badPackets; }
      public int getTotalPackets() { return totalPackets; }
    
      public void update(/* TBD */) { /* updates the fields appropriately */ }
      public Statistics() { bytes=goodPackets=badPackets=totalPackets=0; }
    }
    
    Statistics stats;
    
  2. 将 4 个字段绑定到我的 GUI 中的元素

  3. 能够在我的主应用程序线程中以任何必要的速度调用stats.update(),其中对“更新”的调用是触发 GUI 更改侦听器的原因
  4. 让 GUI 以我可以指定的较低频率“自动”更新,大约 5-20Hz,这样它就不会被大量触发事件所淹没。

是否有适当的机制可以让我做我想做的事?我正在查看 JGoodies DelayedReadValueModel,但我真的不知道如何使用它。

如果我必须自己手动完成,我想我可能会做的是:

  1. 拥有统计信息的镜像副本,并添加某种更新标志,以及从原始副本到镜像副本的链接,以及计时器超时
  2. 调用update()方法时,设置更新标志,调用类似maybePropagate()的方法
  3. maybePropagate():如果定时器超时,或者镜像副本的链接为空,则什么都不做;否则启动超时并将更新的数据发送到镜像副本,并清除更新标志
  4. 定时器超时后,如果设置了更新标志且镜像副本的链接不为空,则将更新后的数据发送到镜像副本并清除更新标志
  5. 在实现了前 4 个元素后,我的镜像副本具有最大的更新速率,因此我可以使用常规 JGoodies BeanAdapter 将 GUI 元素绑定到镜像副本的字段。

有什么建议吗?

【问题讨论】:

    标签: java binding jgoodies


    【解决方案1】:

    如果您有统计数据的表示模型,您的绑定代码可能如下所示:

    ValueModel bytesModel = statsPresentationModel.getModel("bytes");
    label = BasicComponentFactory.createLabel(bytesModel);
    

    现在要延迟更新,您可以为字节字段包装值模型:

    ValueModel bytesModel = new DelayedReadValueModel(statsPresentationModel.getModel("bytes"));
    label = BasicComponentFactory.createLabel(bytesModel);
    

    【讨论】:

      【解决方案2】:

      虽然 JGoodies Binding 使用 Delayed* 类解决了这个问题,但您可以考虑使用具有标准 Swing 功能的方法。

      如果您使用 SwingWorker,您可以在后台发布元素并在 EDT 中处理它们。 SwingWorker 进程将获取大量已发布的数据并减少 EDT 更改的次数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 2020-03-07
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多