2010-04-28 5 views
5

Google Guice를 사용하는 Java Swing 응용 프로그램을 IOC 컨테이너로 사용하고 있습니다. 모든 것이 잘 작동합니다. 몇 가지 UI 문제가 있습니다. 표준 L & F가 Pushing 픽셀 Substance L & F로 대체 된 경우 Guice의 스윙 구성 요소가 UI 스레드 외부에서 생성되어 응용 프로그램이 실행되지 않습니다.Guice가 UI 스레드 문제 외에 스윙 구성 요소를 생성합니까?

Guice에게 UI 스레드에서 스윙 구성 요소를 만들도록 지시하는 방법이 있습니까?

SwingUtilities.invokeAndWait(Runnable)을 만든 후에 스윙 구성 요소를 반환하는 사용자 지정 공급자를 만들어야 할 수도 있습니다.

UI 스레드에서 전체 응용 프로그램을 실행하는 생각이 싫지만 어쩌면 완벽한 솔루션 일 수 있습니다.

답변

5

IMO Guice를 사용하여 구성 요소를 만들지 말고 구성 요소를 만들 서비스를 만들어야합니다. 서비스를 주입 한 후에는 invokeAndWait을 사용하여 EDT에서 구성 요소 생성을 확인하는 것이 쉬워야합니다.

+1

이것은 내 문제에 대한 가장 단순하고 쉬운 해결책이었습니다. Swing 구성 요소를 확장하고 Guice가 인스턴스화하도록 초기 오류를 만들었습니다. 컴포지션으로 전환 한 후 (예 : Swing 구성 요소를 참조하는 건물 서비스) EDT에 명시 적으로 생성 된 모든 서비스가 정상적으로 처리되었습니다. 응용 프로그램의 응답 성이 향상되고 더 이상 UI 결함이 없습니다. 요령 : 물질 모양 및 느낌은 스윙 코드가 EDT 외부에서 사용되는지 테스트하는 데 훌륭한 도구입니다. –

0

실제로 Swing is not multi-threaded이며 EDT로 실행해야합니다. 따라서 네 구성 요소는 EDT에서 invokeAndWait으로 전화하여 준비해야합니다.

+0

답변 해 주셔서 감사합니다. Guice를 사용하여 Swing 구성 요소의 독창적 인 제작자로 어떻게 해결할 수 있습니까? –

+0

글쎄, 이름을 정하자 : invokeAndWait ....을 사용하여 Swing 컴포넌트를 생성한다. ooooh Guice는 멀티 스레드인가? 스레드를 생성하지 않으면 EDT에서 첫 번째 getInstance()를 호출하여 코드를 간단하게 작성할 수 있기 때문입니다. – Riduidel

1

Guts-GUI 프로젝트 (Guice 기반의 Swing 앱 프레임 워크)를 확인해보십시오. Guts-GUI는 Guice에 의해 작성된 구성 요소가 EDT에서 작성되었음을 확인합니다.

Guice 자체는 EDT에서 생성 될 구성 요소를 선언하기위한 어떠한 방법으로도 제공되지 않습니다. Guice 스코프을 사용할 수 있는지는 확실하지 않지만 (예라고 생각합니다.) 그러나 어떤 스코프 기반 솔루션도 성능면에서 보람이 있을지 확신 할 수 없습니다.

이 문제를 해결하기위한 첫 번째 단계는 Guice Injector가 (SwingUtilities.invokeAndWait 또는 invokeLater를 사용하여) EDT 내부에서 만들어 졌는지 확인하는 것입니다. 이것은 Guts-GUI가 처음에하는 일입니다. 따라서 일부 구성 요소가 Guice가 초기에 작성한 경우 EDT에서 작성됩니다.

그런 다음 Guice가 주입하고 주입 된 스윙 구성 요소를 만들어야하는 인스턴스가 EDT에서 가져와야합니다 (예 : Injector.getInstance(...) 통해).