Guice создает компоненты Swing вне проблемы потока пользовательского интерфейса?
Я работаю над приложением Java Swing с Google Guice в качестве контейнера IOC. Все работает довольно хорошо. Есть некоторые проблемы с пользовательским интерфейсом. При замене стандартного L&F на Pushing пиксели приложение L&F субстанции не запускается из-за создания компонентов Guice Swing вне потока пользовательского интерфейса.
Есть ли способ сказать Guice для создания компонентов Swing в потоке пользовательского интерфейса?
Может быть, я должен создать пользовательских провайдеров, которые будут возвращать компоненты Swing после SwingUtilities.invokeAndWait(Runnable)
создает их.
Мне не нравится идея запуска всего приложения в потоке пользовательского интерфейса, но, возможно, это просто идеальное решение.
3 ответа
IMO, вы не должны создавать компоненты, используя Guice, а сервисы, которые, в свою очередь, будут создавать ваши компоненты. После того, как вы внедрили свой сервис, должно быть легко убедиться, что создание компонента происходит в EDT (используя invokeAndWait
)
Возможно, вы захотите проверить мой проект Guts-GUI (каркас приложения Swing, построенный на Guice). Guts-GUI гарантирует, что ваши компоненты, даже если они созданы Guice, созданы в EDT.
Сам Guice не предоставляет никакого способа, из коробки, объявить компонент, который будет создан в EDT. Я не уверен, что для этого можно использовать Guice Scopes (я думаю, что да), однако я не уверен, что какое-либо решение на основе Scope будет целесообразным, в частности, в отношении производительности.
Первый шаг к решению этой проблемы - убедиться, что Guice Injector создан изнутри EDT (с помощью SwingUtilities.invokeAndWait или invokeLater). Это то, что Guts-GUI делает в первую очередь. Следовательно, если некоторые компоненты были созданы Guice раньше, они будут созданы в EDT.
Затем вы должны убедиться, что все экземпляры, внедренные Guice, и которые требуют создания внедренных компонентов Swing, получены (например, через Injector.getInstance(...)
) из EDT.
На самом деле Swing не является многопоточным и требует запуска в EDT. Как следствие, да, ваши компоненты должны быть подготовлены в EDT по телефону invokeAndWait
,