Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: GUI и Java FX приложения > нужны часики :) |
Автор: SySaD 23.4.2008, 17:11 | ||||||
Доброго дня. Возникла интересная проблема которую пока не знаю как решить. Вкратце: в проекте несколько модулей есть объект, описывающий состояние системы, далее - процесс-менеджер, имеющий public функцию processGUIaction(int ActionCode), которая в зависимости от параметра анализирует состояние системы, готовит/изменяет данные и вызывает функцию перерисовки GUI - GUI, имеющий открытую функцию drawPageOnSs(), которая анализирует состояние системы, формирует нужное окошко и отображает его - посредник между процесс-менеджером и GUI, передающий обращения одного к другому определенные события в GUI вызывают обращения к процесс-менеджеру обновлением данных в GUI занимается эта функция, упрощенно выглядящая как показано ниже
все работает нормально далее в 3 местах проходит большая работа по выборке данных из базы и подготовке их для вывода на экран. занимает от 5 до 30 секунд. на эти время надо вывести на экран поверх основного фрейма gif с часиками ![]() я набросал навскидку класс:
и попробовал его запускать в отдельную нить, для того чтобы он был поверх всех окон но не блокировал выполнение программы. И тут возникла ситуация, что диалог рисуется, но без элементов внутри, просто серый прямоугольничек. Если я вызываю тупо, например:
то все хорошо - анимэшка играет, все рисует, но останавливается вся программа пока не закрою окошко. Может у кого есть идеи. Понимаю что скорее всего это нехватка знаний. Но жду идей. спасибо всем |
Автор: powerOn 23.4.2008, 17:22 |
Попробуйте запускать TimeDialog в новом потоке. |
Автор: SySaD 24.4.2008, 11:21 |
в GUI через посредник вызываю такую функцию для примера public void showProgress() { final Logger logger = Logger.getLogger("storm"); logger.debug("show begin"); final TimeDilog dlg = new TimeDilog(); dlg.pack(); Thread t = new Thread() { public void run() { dlg.setVisible(true); } }; t.start(); } и повесил вызов напрямую на одну из кнопок получились результаты 1) прямой вызов с кнопки: http://ipicture.ru/ 2) вызов через showProgress http://ipicture.ru/ если использую invokeLater то отрисовывается но уже после подготовки данных (в процесс-менеджере на кнопку "выбрать" срабатывает 1) вызов showProgress 2) подготовка данных 3) hideProgress 4) вызов drawPageOnSs ) |
Автор: SySaD 24.4.2008, 14:46 |
В догонку: диаог с часами отрисовывается после того как отрабатывает drawPageOnSs. видимо это связано с очередью событий, но решения все равно не знаю. invoke тут видимо ни при чем... |
Автор: SySaD 24.4.2008, 16:52 | ||
да обработка и так висит в отдельном потоке GUI не подвисает а ждет пока процесс-менеджер подготовит данные для отображения и вызовет drawPageOnSs обработка кнопок вообще минимальна: например на кнопку "выбрать"
ключевое здесь это proccessGUIAction(Constants.ACTION_SELECT_SURVEY); через класс-посредник вызывается процесс-менеджер, который обрабатывает нужные данные мне интересно почему не отриовывается TimeDialog или отрисовывается после выполнения drawPageOnSs если нужен код - то только в личку |
Автор: powerOn 24.4.2008, 17:21 | ||
Посмотрите вот на этот пример:
|
Автор: SySaD 25.4.2008, 14:25 |
Да, пример понятен, спасибо. к сожалению у нас немного другая система и пишет ее целая группа программистов,я отвечаю лишь за GUI. Написал простенький пример, по которому можно понять логику работы текущего варианта проекта и увидеть проблему которую я описывал. |