2010-04-28 14 views
5

Estoy trabajando en la aplicación Java Swing con Google Guice como un contenedor IOC. Las cosas están funcionando bastante bien. Hay algunos problemas de UI. Cuando se reemplaza un estándar L & F con píxeles de empuje Sustancia L & La aplicación F no se está ejecutando debido a la creación de componentes Swing de Guice fuera del subproceso de la interfaz de usuario.Guice crea componentes Swing fuera del problema de la hebra de UI?

¿Hay alguna manera de decirle a Guice que cree componentes Swing en el hilo de la interfaz de usuario?

Tal vez debería crear proveedores personalizados que devuelvan componentes Swing después de que SwingUtilities.invokeAndWait(Runnable) los cree.

No me gusta la idea de ejecutar toda la aplicación en el hilo de UI, pero tal vez es una solución perfecta.

Respuesta

5

IMO no debe crear componentes usando Guice sino servicios que a su vez crearán sus componentes. Una vez que tenga su servicio inyectado, debería ser fácil asegurarse de que la creación de componentes ocurra en EDT (usando invokeAndWait)

+1

Esta fue la solución más simple y fácil para mi problema. Cometí un error temprano al extender los componentes de Swing y dejar que Guice los instanciara. Después de cambiar a composición, es decir, crear servicios que hacen referencia a componentes Swing y tenerlos creados explícitamente en EDT, todo salió bien. La aplicación se comporta mejor y no hay más fallas en la interfaz de usuario. CONSEJO: El aspecto y tacto de la sustancia es una gran herramienta para probar si el código Swing se usa fuera de EDT. –

0

De hecho, Swing is not multi-threaded y requiere que se ejecute en EDT. Como consecuencia, sí, sus componentes deben prepararse en EDT llamando al invokeAndWait.

+0

Gracias por la respuesta. ¿Cómo lo resolverías usando Guice como el único creador de componentes Swing? –

+0

Bueno, lo que quieras: creas tus componentes Swing usando invokeAndWait .... ooooh ¿Guice es mono o multihilo? Porque si no desencadena el hilo, puede incluso simplificar su código llamando a su primer getInstance() en EDT. – Riduidel

1

Es posible que desee verificar mi proyecto Guts-GUI (Swing app framework basado en Guice). Guts-GUI se asegura de que sus componentes, incluso creados por Guice, se creen en el EDT.

Guice en sí no proporciona ninguna forma, fuera de la caja, para declarar un componente que se creará en el EDT. No estoy seguro si Guice Scopes podría utilizarse para eso (creo que sí), sin embargo, no estoy seguro de que una solución basada en el Alcance merezca la pena, en particular en lo que respecta al rendimiento.

El primer paso para resolver este problema es asegurarse de que Guice Injector se crea desde el EDT (utilizando SwingUtilities.invokeAndWait o invokeLater). Esto es lo que Guts-GUI hace en primer lugar. Por lo tanto, si Guice crea algunos componentes con anticipación, se crearán en el EDT.

Luego debe asegurarse de que cualquier instancia inyectada por Guice, y que requiera la creación de componentes Swing inyectados, se obtenga (por ejemplo, a través de Injector.getInstance(...)) desde el EDT.

Cuestiones relacionadas