![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
CHEM_Eugene |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 12.2.2008 Репутация: нет Всего: нет |
Есть некоторая Task implements Runnable, которая выполняется через SwingUtilities.invokeLater
внутри этой таски есть несколько вызовов методов, которые трудозатратны, но они отрисовывают GUI. Я показываю progress bar, но он работает не так как надо - прогресс показывается только после завершения всей таски, а не после каждого этапа. Код примерно такой:
Как итог, я вижу сразу значение 30, после того, как задача выполнится целиком. Получается, что у меня все операции должны выполняться в потоке EDT, поэтому я не могу использовать другие потоки для этих операций или что-нибудь типа SwingWorker. Проблема осложняется тем, что progress - не что иное, как инстанс класса унаследованного от Observable. То есть как только мы делаем progress.setProgress(value) это приводит к нотификации Observer-а и в итоге прогресс бар перерисовывается. Подскажите, кто сталкивался, пожалуйста! Это сообщение отредактировал(а) CHEM_Eugene - 5.10.2011, 12:37 |
|||
|
||||
Connie |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 382 Регистрация: 12.8.2008 Репутация: 8 Всего: 9 |
http://download.oracle.com/javase/tutorial...s/progress.html
Это сообщение отредактировал(а) Connie - 8.10.2011, 22:22 |
|||
|
||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
С точностью до наоборот. Тяжелые операции надо выполнять в рабочем потоке, а вызов setProgress() делать на EDT. Вот хорошая статья, там как раз есть пример с публикацией частичных результатов операции. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
CHEM_Eugene |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 12.2.2008 Репутация: нет Всего: нет |
это было ключевой фразой. Connie, jk1, это не в тему. Именно рендеринг таблицы и занимает львиную долю времени. |
|||
|
||||
Skipy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 4 Всего: 16 |
Ну, если Вы считаете, что это не в тему - ищите сами. Хотя именно тут и зарыта собака. |
|||
|
||||
jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Похоже действительно не в тему. Насколько я понимаю автора, у него есть много legacy-кода, в котором тяжелые операции перемешаны с отрисовкой GUI. Можно попытаться вызов progress.setProgress офомить вот так:
Тогда следующая часть задачи начнет выполняться после update'а progress bar -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
CHEM_Eugene |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 12.2.2008 Репутация: нет Всего: нет |
Решил проблему следующим образом:
Вместо того, чтобы выполнять всю исходную Task через SwingUtilities.invokeLater, я выполняю ее в другом клиентском потоке. При этом в самой таске затратные операции по отрисовке выполняются в EDT, а между ними отрабатывает перерисовка progress bar |
|||
|
||||
Skipy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 4 Всего: 16 |
В тему. invokeLater ставит выполнение переданного Runnable в очередь EDT. Туда же попадает и событие по перерисовке progress bar-а. И пока не выполнится весь Runnable - как одно событие! - отрисовка прогресса не произойдет. А когда ТС вынес всю работу в другой поток, а отрисовку оставил только эпизодическую - тогда и появилась техническая возможность вклинить между отрисовками компоненты перерисовку прогресса. BTW, а отрисовку на offscreen image можно вообще всю в другом потоке делать. А потом в EDT одним движением отрисовать компоненту. Это сообщение отредактировал(а) Skipy - 10.10.2011, 15:52 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |