Обновить JLabel из другого потока, не разделяя все мои процессы на потоки?

Я разрабатываю большой проект на Java Swing. Он имеет подключение к базе данных, управление внешними устройствами и обработку SD-карт.

В настоящее время у меня есть много тяжелых процессов, которые выполняются в потоке EDT, и создание отдельных потоков для всех из них — это долгая задача, которую я пытаюсь избежать... Кроме того, это, вероятно, приведет к множеству проблем параллелизма, которые Я не готов справиться.

Дело в том, что я хочу ввести загрузку JLabel с загрузкой gif, пока обрабатываются долгие занятые задачи. Также важно подчеркнуть, что я хочу, чтобы весь мой интерфейс Swing был заблокирован, пока выполняются длительные задачи, как это происходит сейчас, ЗА ИСКЛЮЧЕНИЕМ метки загрузки.

Есть ли способ актуализировать этот ярлык из другого потока?


person jpaguerre    schedule 10.06.2013    source источник
comment
Есть ли способ актуализировать эту метку из другого потока? Вы всегда можете реализовать свою собственную EventQueue и решить отправлять события из другого потока, но я почти уверен, что вы столкнетесь с серьезными проблемами параллелизма. Блокировать пользовательский интерфейс несложно с помощью модального JDialog (который по-прежнему позволяет выполнять рисование). Перемещение вашего кода длительной задачи в другой поток не так сложно, но вам необходимо убедиться, что обновления Swing выполняются в EDT. У вашей проблемы нет простых решений. Настройка потребует некоторого времени и усилий, но это единственное хорошее решение.   -  person Guillaume Polet    schedule 10.06.2013
comment
Спасибо за ответ. Ну, а что, если я сделаю еще одну программу для свинга, которая просто отображает загружаемое изображение и вызовет ее из моего свинга?? тогда проблема с потоками будет решена ОС, верно?   -  person jpaguerre    schedule 10.06.2013
comment
@user2471107 user2471107 Конечно, это сработает, но у вас не будет модальности, если пользователь нажмет на ваш исходный кадр, ваше загружаемое изображение исчезнет. Пользователю будет разрешено закрыть вашу загрузку GIF и т. д. И вам придется вызывать это везде в вашем коде. Опять же, на это тратится почти столько же усилий, сколько и на то, чтобы делать все правильно, чтобы в конечном итоге получить плохой результат. Делайте все правильно: это сэкономит ваше время и обеспечит хороший результат.   -  person Guillaume Polet    schedule 10.06.2013
comment
@user2471107 user2471107 Я не понимаю твоего нежелания решить настоящую проблему, но в то же время ты готов пойти на крайние меры, чтобы обойти ее... У вас может уйти пара дней, чтобы правильно решить проблему, но оно того стоит .   -  person Harald K    schedule 10.06.2013


Ответы (1)


Если вы заботитесь о хорошем пользовательском опыте, вам действительно не избежать использования SwingWorker или аналогичного, чтобы разгрузить работу из потока диспетчера событий (EDT). Если вам нужно действительно «заблокировать» пользовательский интерфейс, вы должны использовать JDialog с индикатором выполнения или подобным.

Краткий ответ на ваш вопрос - нет. Jlabel должен быть создан и добавлен из EDT.

Однако у вас должна быть возможность добавить JLabel, вам просто нужно убедиться, что вы сделали это до запуска длительных блокирующих задач. Затем удалите его после того, как это будет сделано.

В любом случае, это хак и ленивый обходной путь для правильных действий, и не рекомендуется. Вы можете столкнуться с тем, что тратите больше времени на решение проблемы и выдергивание волос, чем просто делаете это правильно с помощью SwingWorkers.

person Harald K    schedule 10.06.2013
comment
Однако у вас должна быть возможность добавить JLabel, вам просто нужно убедиться, что вы сделали это до того, как начнутся длительные блокирующие задачи Неверно. repaint запланировано, и пока repaint не состоялось, JLabel не видно. Добиться этого не так уж и просто - person Robin; 10.06.2013
comment
Спасибо за ответ. Дело в том, что даже если я добавлю его перед длительной задачей, анимированный gif не отображается с его анимацией... просто как изображение... есть идеи, как отобразить анимацию? - person jpaguerre; 10.06.2013
comment
@ Робин правда. Я не очень рекомендую этот подход. - person Harald K; 10.06.2013
comment
@ user2471107: Вы не упомянули анимацию в своем вопросе... Я не думаю, что это сработает с анимацией. - person Harald K; 10.06.2013
comment
Я отредактировал свой ответ, чтобы было ясно, что я бы не рекомендовал делать это так. :-) - person Harald K; 10.06.2013
comment
@ user2471107 вы пытаетесь сократить путь, делая что-то неправильно. Это принесет вам только больше проблем, и в конечном итоге вам потребуется больше времени, чтобы иметь что-то, что работает только частично, если оно не работает вообще. Мой лучший совет — сказать вам, чтобы вы делали все правильно и прилагали дополнительные усилия, делая это правильно. - person Guillaume Polet; 10.06.2013
comment
Есть ли простой способ запустить весь подпроект netbeans в отдельном потоке? - person jpaguerre; 10.06.2013