3

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

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

我想做的大致是:

  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 元素绑定到镜像副本的字段。

有什么建议么?

4

2 回答 2

3

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

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

于 2012-06-01T08:44:56.570 回答
1

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

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

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

ValueModel bytesModel = new DelayedReadValueModel(statsPresentationModel.getModel("bytes"));
label = BasicComponentFactory.createLabel(bytesModel);
于 2011-02-03T20:33:36.813 回答