【问题标题】:How to combine Swing and SpringFramework?如何结合 Swing 和 SpringFramework?
【发布时间】:2015-03-04 10:16:51
【问题描述】:

Swing 需要从事件调度线程 (EDT) 中运行。如何在 Spring 上下文中确保这一点?

在一些教程中,like this one,swing 组件只是像普通 bean 一样被实例化。这样可以吗?

【问题讨论】:

标签: java spring swing event-dispatch-thread


【解决方案1】:

正如您已经猜到的那样,在 Event Dispatching Thread 又名 EDT 中运行您的 Swing 代码会更安全,因为大多数Swing 组件不是线程安全的。以下是 Oracle 文档中的说明:

Swing 事件处理代码在称为事件的特殊线程上运行 调度线程。大多数调用 Swing 方法的代码也运行在 这个线程。这是必要的,因为大多数 Swing 对象方法都是 不是“线程安全的”:从多个线程中调用它们会带来线程风险 干扰或内存一致性错误。

因此,如果您在 EDT 线程中初始化 Spring ApplicationContext 以便您的组件被初始化并在同一个线程中运行,那么您应该是安全的:

SwingUtilities.invokeLater(new Runnable() 
{
  public void run() 
  {
    new ClassPathXmlApplicationContext( "your-application-context.xml" ); // pay attention to context so that it is not left open
  }
});

【讨论】:

  • 这不是一个好主意,EDT 等待直到加载 ClassPathXmlApplicationContext 中的任何内容,invokeLater 被指定通知在 Swing API 中实现的方法,这些 API 中的方法,
  • 这可能是一个捷径,是的,而不是最终的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2017-05-12
  • 1970-01-01
  • 2011-08-29
相关资源
最近更新 更多