Безопасно ли создавать виджеты Swing/AWT NOT на тему Dispatch Event?

Я интегрировал Substance в мое приложение и столкнулся с несколькими проблемами относительно его внутреннего EDT (Event Dispatch Thread ) проверки процедур. Вещество абсолютно отказывается строить классы пользовательского интерфейса за пределами EDT. Я сделал много Swing/AWT, и я знаю большинство правил относительно EDT. Я использую SwingWorker, SwingUtilties.invokeLater для изменения компонентов. Я всегда, хотя эти компоненты могут быть CONSTRUCTED вне EDT, но должны быть реализованы и манипулированы на EDT. Другими словами, вы можете создавать и настраивать настройки по умолчанию в фоновом режиме, но вызов pack/setVisible должен быть EDT, а также любые последующие вызовы для управления компонентом.

Причина, по которой я спрашиваю, заключается в том, что у меня есть особенно "многообещающее" окно для построения, включающее множество виджетов, состояния и ресурсов (много значков). Раньше я построил окно на фоновом методе SwingWorker и сделал окно видимым в готовом методе. Никогда не было ни одной проблемы. При переключении на вещество внутренняя проверка EDT укусит меня.

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

Обернуть его... Безопасно ли конструировать виджеты Swing/AWT NOT на тему Dispatch Event?

Ответ 1

Sun изменила правила в 2004 году - раньше вам было разрешено создавать компоненты вне EDT и им приходилось перемещаться в EDT только после того, как компонент был реализован.

Новое правило теперь гласит:

Чтобы избежать возможности блокировки, вы должны проявлять особую осторожность, чтобы Swing компоненты и модели созданы, изменен и запрошен только с поток событий.

этот в блоге, посвященный моей статье, дает более подробную информацию, включая ссылки на другие связанные статьи. обратите внимание, что все официальные Sun examples были переписаны и очень строги к этому.

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

Ответ 2

Нет.

Простая причина заключается в том, что даже EDT любит затормозить в некоторых редких случаях, и в целом легко отключить пользовательский интерфейс при использовании Swing (или, как мне сказали,). Я предлагаю вам прочитать эти три статьи из блога Kirill (the Substance dev):