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

时间:2010-04-28 09:13:13

标签: java swing instantiation guice ui-thread

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

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

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

您可能想要查看我的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(...))。

答案 2 :(得分:0)

事实上,Swing is not multi-threaded并且需要在EDT中运行。因此,是的,您的组件应该在EDT中通过调用invokeAndWait来准备。