5

我正在使用 Google Guice 作为 IOC 容器来开发 Java Swing 应用程序。事情进展顺利。有一些用户界面问题。当标准 L&F 替换为推送像素时,由于 Guice 的 Swing 组件在 UI 线程之外创建,Substance L&F 应用程序未运行。

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

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

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

4

3 回答 3

5

IMO 您不应该使用 Guice 创建组件,而是使用服务创建您的组件。注入服务后,应该很容易确保在 EDT 上创建组件(使用invokeAndWait

于 2010-04-28T13:03:23.933 回答
1

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

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

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

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

于 2010-05-03T05:53:44.867 回答
0

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

于 2010-04-28T09:17:03.803 回答