У меня есть java-приложение, которое обновляет данные с переменной скоростью (полученные из довольно высокоскоростного потока данных, находящегося вне моего контроля, но до 120 КБ/с), и я хотел бы отображать статистику, такую как количество полученных байтов/пакетов , используя диалоговое окно.
Присматриваюсь к привязкам JGoodies и нашел что-то предварительно работающее с искусственными данными, полученными по низким рейтам.
Что я хотел бы сделать, грубо говоря, это:
создайте класс 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 поля к элементам в моем графическом интерфейсе
- иметь возможность вызывать
stats.update()с любой скоростью, необходимой в моем основном потоке приложения, где вызов «обновить» - это то, что запускает прослушиватели изменений графического интерфейса - иметь «автоматическое» обновление графического интерфейса с более низкой частотой, которую я могу указать, примерно 5-20 Гц, чтобы он не перегружался массой инициированных событий.
Есть ли соответствующий механизм, который позволил бы мне делать то, что я хочу? Я смотрю на JGoodies DelayedReadValueModel, но я действительно не понимаю, как его использовать.
Если бы мне пришлось делать это самому вручную, я бы, наверное, сделал следующее:
- иметь зеркальную копию статистики и добавить какой-то флаг обновления, а также ссылку с оригинала на зеркальную копию и тайм-аут таймера
- при вызове метода
update()установите флаг обновления и вызовите такой метод, какmaybePropagate() maybePropagate(): если время ожидания таймера истекло или ссылка на зеркальную копию пуста, ничего не происходит; в противном случае он запускает тайм-аут и отправляет обновленные данные в зеркальную копию и очищает флаг обновления- по истечении тайм-аута таймера, если установлен флаг обновления и ссылка на зеркальную копию не нулевая, он отправляет обновленные данные в зеркальную копию и сбрасывает флаг обновления
- Реализовав предыдущие 4 элемента, моя зеркальная копия имеет максимальную скорость обновления, и поэтому я могу просто привязать элементы GUI к полям зеркальной копии с помощью обычного JGoodies BeanAdapter.
Какие-либо предложения?