привязки jgoodies + объединение частых изменений

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

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

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

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

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

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

Какие-либо предложения?


person Jason S    schedule 11.03.2009    source источник


Ответы (2)


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

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

person Karsten Lentzsch    schedule 01.06.2012

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

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

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

ValueModel bytesModel = new DelayedReadValueModel(statsPresentationModel.getModel("bytes"));
label = BasicComponentFactory.createLabel(bytesModel);
person Felix Leipold    schedule 03.02.2011