Как да комбинирате Swing и SpringFramework?

Swing изисква да се изпълнява от Event Dispatch Thread (EDT). Как да се гарантира това в контекста на пролетта?

В някои уроци, като този, swing компонентите просто се инстанцират като нормални зърна. Това добре ли е?


person Suzan Cioc    schedule 04.03.2015    source източник
comment
Опитайте stackoverflow.com /questions/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