Обновить индикатор выполнения из рабочего потока - PullRequest
3 голосов
/ 23 января 2011

Я создаю Java-программу, которая загружает N элементов с сервера. Я хотел бы иметь рабочий индикатор выполнения, который показывает «уже загруженные элементы» / N в процентах. Прямо сейчас я обновляю значение индикатора выполнения, передавая потоку ссылку на объект GUI, но это делает код «уродливым» (класс GUI создает поток, который содержит ссылку на сам GUI, создавая своего рода цикл). Есть ли лучший способ сделать это?

Ответы [ 4 ]

5 голосов
/ 23 января 2011

SwingWorker имеет некоторые преимущества в этом контексте, как предлагается в этом примере .

2 голосов
/ 23 января 2011

Для того, чтобы убрать «петлю».Создайте интерфейс, который расширяет графический интерфейс, который передается в рабочий поток.

2 голосов
/ 23 января 2011

Прочитайте JProgressBar API и перейдите по ссылке на учебное пособие по Swing «Как использовать индикаторы выполнения» для рабочего примера.

0 голосов
/ 23 января 2011

Одним из шаблонов проектирования, который здесь может быть полезен, является шаблон слушателя. Зарегистрируйте обработчик прогресса в рабочем потоке. Затем слушатель отвечает за публикацию в GUI (или что-то еще, что может быть заинтересовано в прогрессе).

Поскольку в подобной ситуации крайне маловероятно, что у вас будет несколько слушателей, часто лучше просто иметь одного слушателя (уменьшает сложность и накладные расходы).

В моих приложениях длительные операции вызываются передачей ProgressTracker (который имеет два типа событий: процент и текст состояния). Эта информация используется для обновления JProgressBar, JLabel, чего угодно ... Я также использую ProgressTracker для проверки необходимости отмены операции.

SwingWorker действительно имеет некоторый код, который помогает объединять несколько обновлений, но он основан на предположении, что долго выполняющиеся задачи должны наследоваться от SwingWorker, что не помогает разделить проблемы. Вам решать, в каком направлении двигаться - лично я предпочитаю, чтобы операции с моими данными не имели никакого отношения к GUI.

Не забудьте публиковать обновления для любых компонентов Swing в EDT с помощью SwingUtilities.invokeLater ()

...