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