Как совместить Swing и SpringFramework?

Swing требует запуска из потока отправки событий (EDT). Как обеспечить это в контексте Spring?

В некоторых учебниках, подобных этому, компоненты просто создаются как обычные bean-компоненты. Это нормально?


person Suzan Cioc    schedule 04.03.2015    source источник
comment
Попробуйте stackoverflow.com /вопросы/22864008/   -  person EpicPandaForce    schedule 04.03.2015


Ответы (1)


Как вы уже догадались, было бы безопаснее запускать код Swing в потоке Event Dispatching Thread, также известном как EDT, поскольку большинство компонентов Swing не потокобезопасный. Вот что указано в документах Oracle:

Код обработки событий Swing выполняется в специальном потоке, известном как поток диспетчеризации событий. Большая часть кода, вызывающего методы Swing, также выполняется в этом потоке. Это необходимо, потому что большинство методов объекта Swing не являются "потокобезопасными": вызов их из нескольких потоков может привести к взаимодействию потоков или ошибкам согласованности памяти.

Таким образом, вы должны быть в безопасности, если вы инициализируете свой Spring ApplicationContext в потоке EDT, чтобы ваши компоненты инициализировались и запускались в одном потоке:

SwingUtilities.invokeLater(new Runnable() 
{
  public void run() 
  {
    new ClassPathXmlApplicationContext( "your-application-context.xml" ); // pay attention to context so that it is not left open
  }
});
person tmarwen    schedule 04.03.2015
comment
нет, это плохая идея, EDT ждет, пока не будет загружено что-либо из ClassPathXmlApplicationContext, invokeLater предназначен для уведомления методов, реализованных в API-интерфейсах Swing, методов в этих API-интерфейсах, - person mKorbel; 04.03.2015
comment
Это может быть коротким путем, а не окончательным решением. - person tmarwen; 04.03.2015