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

发布于 2024-08-30 17:57:50 字数 341 浏览 11 评论 0原文

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

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

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

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

I'm working on Java Swing application with Google Guice as an IOC container. Things are working pretty well. There are some UI problems. When a standard L&F is replaced with Pushing pixels Substance L&F application is not running due to Guice's Swing components creation outside of UI thread.

Is there a way to tell Guice to create Swing components in the UI thread?

Maybe I should create custom providers which will return Swing components after SwingUtilities.invokeAndWait(Runnable) creates them.

I don't like the idea of running the whole application in UI thread, but maybe it's just a perfect solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

莫言歌 2024-09-06 17:57:51

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

In fact, Swing is not multi-threaded and requires to be run in EDT. As a consequence, yes, your components should be prepared in EDT by calling invokeAndWait.

注定孤独终老 2024-09-06 17:57:50

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

IMO you should not create components using Guice but services which in turn will create your components. Once you have you service injected it should be easy to make sure that component creation happens on EDT (using invokeAndWait )

人心善变 2024-09-06 17:57:50

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

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

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

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

You might want to check out my Guts-GUI project (Swing app framework built upon Guice).
Guts-GUI makes sure your components, even when created by Guice, are created in the EDT.

Guice itself doesn't provided any way, out of the box, to declare a component to be created in the EDT. I am not sure if Guice Scopes could be used for that (I think yes), however, I am not sure that any Scope-based solution would be worthwhile, in particular regarding performance.

The first step to solving this problem is to make sure that Guice Injector is created from inside the EDT (by using SwingUtilities.invokeAndWait or invokeLater). This is what Guts-GUI does in the first place. Hence, if some components are created early by Guice, they will be created in the EDT.

Then you must ensure that any instances injected by Guice, and that require creation of injected Swing components, are obtained (eg through Injector.getInstance(...)) from the EDT.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文