我正在使用Google Guice作为IOC容器处理Java Swing应用程序。事情进展顺利。有一些UI问题。当标准L& F被Pushing像素替换时,由于在UI线程之外创建Guice的Swing组件,Substance L& F应用程序没有运行。
有没有办法告诉Guice在UI线程中创建Swing组件?
也许我应该创建自定义提供程序,它们会在SwingUtilities.invokeAndWait(Runnable)
创建后返回Swing组件。
我不喜欢在UI线程中运行整个应用程序的想法,但也许它只是一个完美的解决方案。
答案 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
来准备。