Guice在UI线程问题之外创建Swing组件?

我正在使用Google Guice作为IOC容器处理Java Swing应用程序。 事情进展顺利。 有一些UI问题。 当用Pushing像素替换标准L&F时由于在UI线程之外创建Guice的Swing组件,物质L&F应用程序未运行。

有没有办法告诉Guice在UI线程中创建Swing组件?

也许我应该创建自定义提供程序,它们将在SwingUtilities.invokeAndWait(Runnable)创建它们之后返回Swing组件。

我不喜欢在UI线程中运行整个应用程序的想法,但也许它只是一个完美的解决方案。

IMO你不应该使用Guice创建组件,而是使用服务来创建组件。 一旦你注入了服务,就应该很容易确保在EDT上创建组件(使用invokeAndWait

您可能想查看我的Guts-GUI项目(基于Guice构建的Swing应用程序框架)。 Guts-GUI确保您的组件,即使是由Guice创建,也是在EDT中创建的。

Guice本身没有提供开箱即用的任何方式来声明在EDT中创建的组件。 我不确定是否可以使用Guice Scopes (我认为是),但是,我不确定任何基于Scope的解决方案是否值得,特别是在性能方面。

解决此问题的第一步是确保从EDT内部创建Guice Injector(通过使用SwingUtilities.invokeAndWait或invokeLater)。 这就是Guts-GUI首先做的事情。 因此,如果某些组件是由Guice早期创建的,那么它们将在EDT中创建。

然后,您必须确保从Guice注入的任何实例以及需要创建注入的Swing组件的实例都是从EDT获得的(例如通过Injector.getInstance(...) )。

事实上, Swing不是multithreading的 ,需要在EDT中运行。 因此,是的,您的组件应该通过调用invokeAndWait在EDT中准备。