2011-01-22 2 views
3

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

ответ

2

Прочтите API JProgressBar и перейдите по ссылке к руководству Swing о том, как использовать Progress Bars для рабочего примера.

+0

upvote бы. Хотите ссылки. –

+1

@pst, ссылки находятся в API. Вы не можете запрограммировать, если у вас нет простого доступа к API для справки. – camickr

2

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

0

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

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

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

У SwingWorker есть код, который помогает слиянием нескольких обновлений, но он основан на предположении, что длительные задачи должны наследоваться от SwingWorker, что не помогает разделить проблемы. Это действительно зависит от вас, в каком направлении - я лично предпочитаю, чтобы операции с моими данными не имели никакого отношения к графическому интерфейсу.

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

Смежные вопросы