я работаю над апплетом с десятью различными источниками данных (например, статистика/журнал ошибок/...). Каждый источник данных обновляется одним сетевым соединением и сообщает об обновлениях через механизм наблюдателя. Апплет имеет различные представления, которые отображают части данных. Каждое представление интересуется только некоторыми частями данных и регистрируется как Observer в необходимых Observables.
Представления (расширенные JPanels) в основном состоят из стандартных компонентов Swing (например, JLabels, JButton,...). Некоторые атрибуты компонентов в представлениях зависят от информации из базовой модели данных.
Пример:
StatisticPanel::paintComponent(Graphics g) {
clearStatisticButton.setEnabled(stat.hasEntries());
minValueLabel.setText(stat.getMinValue());
super.paintComponent(g);
}
Эта логика реализована в методе paintComponent()
панели StatisticPanel, а методы update()
просто вызывают repaint(), потому что я не хотел манипулировать компонентами вне EDT.
Является ли это предполагаемым способом обновления компонентов Swing в многопоточной среде? Лучше ли использовать Runnable с SwingUtitlies.invokeLater()
? Есть ли лучшие подходы к этой проблеме?