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,

Другие вопросы по тегам