Guice создает компоненты Swing вне проблемы потока пользовательского интерфейса? - PullRequest
5 голосов
/ 28 апреля 2010

Я работаю над приложением Java Swing с Google Guice в качестве контейнера IOC. Все работает довольно хорошо. Есть некоторые проблемы с пользовательским интерфейсом. При замене стандартного L & F на Pushing пиксели приложение L & F субстанции не запускается из-за создания компонентов Guice Swing вне потока пользовательского интерфейса.

Есть ли способ сообщить Guice о создании компонентов Swing в потоке пользовательского интерфейса?

Возможно, мне следует создать пользовательских провайдеров, которые будут возвращать компоненты Swing после того, как SwingUtilities.invokeAndWait(Runnable) создаст их.

Мне не нравится идея запуска всего приложения в потоке пользовательского интерфейса, но, возможно, это просто идеальное решение.

Ответы [ 3 ]

5 голосов
/ 28 апреля 2010

IMO, вы не должны создавать компоненты, используя Guice, а сервисы, которые, в свою очередь, будут создавать ваши компоненты. После того, как вы внедрили свой сервис, должно быть легко убедиться, что создание компонента происходит в EDT (используя invokeAndWait)

1 голос
/ 03 мая 2010

Возможно, вы захотите проверить мой 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.

0 голосов
/ 28 апреля 2010

Фактически, Swing не является многопоточным и требует запуска в EDT. Как следствие, да, ваши компоненты должны быть подготовлены в EDT по телефону invokeAndWait.

...