Привязки jgoodies + объединение частых изменений - PullRequest
3 голосов
/ 11 марта 2009

У меня есть Java-приложение, которое обновляет данные с переменной скоростью (полученные из довольно высокоскоростного потока данных вне моего контроля, но до 120 Кбайт / с), и я хотел бы отображать статистику, например, # байтов / пакеты получены с использованием диалогового окна.

Я изучаю JGoodies bindings и получил что-то предварительно работающее с искусственными данными, полученными по низким ставкам.

То, что я хотел бы сделать примерно:

  1. сделать класс бобов примерно таким:

    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 поля к элементам в моем графическом интерфейсе

  3. сможет вызывать stats.update() с любой скоростью, необходимой в моем основном потоке приложений, где вызов "update" - это то, что запускает прослушиватели изменений GUI
  4. иметь графический интерфейс «автоматически» обновлять с более низкой частотой, которую я могу указать, примерно 5-20 Гц, чтобы он не был перегружен гобами инициированных событий.

Есть ли подходящий механизм, который позволил бы мне делать то, что я хочу? Я смотрю на JGoodies DelayedReadValueModel, но я не совсем понимаю, как его использовать.

Если бы мне пришлось делать это вручную, я думаю, что я, вероятно, сделал бы:

  1. имеет зеркальную копию статистики и добавляет какой-либо флаг обновления, а также ссылку с оригинала на зеркальную копию и тайм-аут таймера
  2. при вызове метода update() установите флаг обновления и вызовите метод, подобный maybePropagate()
  3. maybePropagate(): если время таймера истекло или ссылка на зеркальную копию пуста, он ничего не делает; в противном случае он запускает тайм-аут и отправляет обновленные данные в зеркальную копию, а также очищает флаг обновления
  4. по истечении времени таймера, если установлен флаг обновления и ссылка на зеркальную копию не равна нулю, он отправляет обновленные данные в зеркальную копию и очищает флаг обновления
  5. Реализовав предыдущие 4 элемента, моя зеркальная копия имеет максимальную скорость обновления, и поэтому я могу просто привязать элементы GUI к полям зеркальной копии с помощью обычного JGoodies BeanAdapter.

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 01 июня 2012

Хотя JGoodies Binding решает эту проблему с классами Delayed *, вы можете рассмотреть возможность использования подхода со стандартными функциями Swing.

Если вы используете SwingWorker, вы можете публиковать элементы в фоновом режиме и обрабатывать их в EDT. Процесс SwingWorker будет получать порции опубликованных данных и сокращать количество изменений EDT.

1 голос
/ 03 февраля 2011

Если у вас есть модель представления для вашей статистики, код привязки может выглядеть следующим образом:

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

Теперь, чтобы отложить обновление, вы можете обернуть модель значения для байтового поля:

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