Я создаю программу java, которая загружает N элементов с сервера. Я хотел бы иметь рабочий график выполнения, который показывает «уже загруженные элементы»/N процентов. Прямо сейчас я обновляю значение progressbar, передавая потоку ссылку на объект GUI, но делает код «уродливым» (GUI-класс создает поток, содержащий ссылку на сам GUI, создающий своего рода цикл). Есть ли лучший способ сделать это?Обновление панели прогресса из рабочего потока
ответ
SwingWorker
имеет некоторые преимущества в этом контексте, как предлагается в этом example.
Прочтите API JProgressBar и перейдите по ссылке к руководству Swing о том, как использовать Progress Bars для рабочего примера.
Чтобы удалить «петлю». Создайте интерфейс, который расширяет GUI, который передается в рабочий поток.
Один шаблон дизайна, который может быть полезен здесь, - это шаблон слушателя. Зарегистрируйте слушателя прогресса с рабочим потоком. Затем слушатель отвечает за публикацию в GUI (или что-то еще, что может заинтересовать прогресс).
Поскольку в такой ситуации маловероятно, что у вас будет несколько слушателей, часто бывает просто иметь только одного слушателя (уменьшает сложность и накладные расходы).
В моих приложениях длинные операции вызывают, передавая в ProgressTracker (который имеет два типа событий: процент и текст состояния). Эта информация используется для обновления JProgressBar, JLabel, независимо от того ... Я также использую ProgressTracker для проверки того, следует ли отменять операцию.
У SwingWorker есть код, который помогает слиянием нескольких обновлений, но он основан на предположении, что длительные задачи должны наследоваться от SwingWorker, что не помогает разделить проблемы. Это действительно зависит от вас, в каком направлении - я лично предпочитаю, чтобы операции с моими данными не имели никакого отношения к графическому интерфейсу.
Не забывайте оставлять свои обновления каких-либо компонентов Swing, на EDT, используя SwingUtilities.invokeLater()
- 1. Включение и обновление панели прогресса из потока
- 2. Обновление списка из рабочего потока?
- 3. Обновление панели результатов из потока MVVM
- 4. Обновление панели прогресса из вложенного Parallel.ForEach
- 5. Завершение рабочего потока из родительского потока - MFC
- 6. Обновление моей панели прогресса при обработке
- 7. UpdateAllViews() из рабочего потока?
- 8. Обновление панели прогресса автоматически или из другой формы (VB)
- 9. Как обновить страницу из рабочего потока
- 10. Обновление пользовательского интерфейса из рабочего потока через делегатов
- 11. Индикатор прогресса с фоном рабочего
- 12. Обновить DataGrid из рабочего потока
- 13. Использование MapPath из рабочего потока
- 14. Progressbar обновление от фонового потока
- 15. Как работает процесс обновления потока пользовательского интерфейса из рабочего потока?
- 16. Обновление прогресса в TextBlock с использованием фонового потока
- 17. Измерение прогресса потока данных SSIS
- 18. Обновление прогресса с MRProgress
- 19. Автоматический дизайн рабочего потока
- 20. Обновление переменной прогресса игры
- 21. Динамическое обновление прогресса UIProgressView
- 22. Рабочий процесс Windows: запуск отдельного рабочего процесса из рабочего потока
- 23. Отключение панели «Синхронизация прогресса» Perforce
- 24. Обновление строки прогресса из другой темы
- 25. Координация рабочего потока shutdown
- 26. тестирование службы рабочего потока
- 27. Ошибка рабочего потока Oozie
- 28. Модель рабочего потока Java
- 29. Двигатель процесса/рабочего потока
- 30. Как заморозить основной поток из рабочего потока
upvote бы. Хотите ссылки. –
@pst, ссылки находятся в API. Вы не можете запрограммировать, если у вас нет простого доступа к API для справки. – camickr