我有一个Java应用程序,它以可变的速率更新数据(从控制之外的相当高速的数据流中接收数据,但最高可达120Kbytes / sec),并且我想显示统计信息,例如接收到的字节数/数据包数,使用对话框。

我正在研究JGoodies bindings,并初步处理了低速率接收到的人工数据。

我想做的大致是:

  • 使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;
    
  • 将4个字段绑定到我的GUI中的元素
  • 能够以我的主应用程序线程中所需的任何速度调用stats.update(),其中对“update”的调用是触发GUI的更改侦听器的方式
  • 可以以我可以指定的较低速率(大约5-20Hz)“自动”更新GUI,因此不会因触发事件的出现而感到不知所措。

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

    如果我必须自己手动执行此操作,我想我可能会做的是:
  • 具有统计信息的镜像副本,并添加某种更新标志,以及从原始副本到镜像副本的链接,以及计时器超时
  • 调用update()方法时的
  • ,设置更新标志,并调用类似maybePropagate()的方法
  • maybePropagate():如果计时器超时正在进行,或者到镜像副本的链接为空,则不执行任何操作;否则,它将启动超时并将更新的数据发送到镜像副本,并清除更新标志
  • ,当计时器超时到期时,如果设置了更新标志并且到镜像副本的链接为非空,则它将更新的数据发送到镜像副本并清除更新标志
  • 实现了前面的4个元素后,我的镜像副本具有更新的最大速率,因此,我可以使用常规的JGoodies BeanAdapter将GUI元素绑定到镜像副本的字段。

  • 有什么建议?

    最佳答案

    尽管JGoodies Binding通过Delayed *类解决了此问题,但是您可以考虑使用具有标准Swing功能的方法。

    如果使用SwingWorker,则可以在后台发布元素并在EDT中对其进行处理。 SwingWorker进程将获取已发布的数据块,并减少EDT更改的次数。

    关于java - jgoodies绑定(bind)+合并频繁更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/634798/

    10-10 11:59