2013-02-12 3 views
1

전체 UI가 올바르게 작동 할 때만 thrad를 실행하고 싶습니다. 모든 구성 요소의 paint()이 완료되었습니다. SwingUtilities.invokeLater()으로 시도했지만 전체 UI가 올라 가기 전에 또는 모든 구성 요소의 paint()이 완료되지 않은 채 스레드가 계속 실행됩니다.전체 UI가 올라간 경우에만 스레드를 실행하십시오.

이 가능합니까?

감사합니다.

+0

예. 것이 가능하다. invokeLater()를 호출하는시기에 따라 다릅니다. 우리가 볼 수 있도록 코드를 공유하십시오. – ATrubka

답변

0

전체 UI가 언제 정상적으로 작동하는지 알 수있는 방법이 없습니다. 주로로드 시간이 많은 자신 만의 구성 요소를 작성했기 때문입니다.

SwingUtilities.invokeAndWait이 있습니다. 그러나 타이밍이 문제가 될 것입니다. UI를 설정하는 initilization 코드를 호출했다면이 코드를 호출해야합니다.

한 가지 방법은 체크 플래그를 사용하는 것입니다. 5 개의 주요 컴포넌트가 있다고 가정하면,로드 된 각 컴포넌트는 자신의 체크 플래그를 설정합니다 (또는 플래그를 보유한 commons 클래스를 말할 수 있습니다). 스레드는 모든 ckeckflags를 기다리고 계속 진행합니다.

CountdownLatch를 사용할 수도 있지만 권장하지 않습니다. 단순하게 유지하십시오.

0

확인. 이제 네 문제가 뭔지 알 겠어. 메소드 paint()는 invokeLater() 호출을 수행하기에 적절한 위치가 아닙니다.

메서드 paint()는 여러 번 호출 될 수 있습니다. 사실, 화면의 일부분을 다시 칠해야 할 때마다 호출됩니다.

나중에 호출을 리스너의 코드 또는 대화 닫기에 추가 할 수는 있지만 paint() 메소드에서 절대로 호출해서는 안됩니다.

또한 paint() 메서드 자체는 항상 Event Dispatch Thread에서 호출되므로 EDT에서 호출되도록하려면 invokeLater를 사용하면 상당히 많은 중복이 발생합니다.

응용 프로그램을 시작하기 위해 작성한 메소드를 표시하면 코드 호출을 정확히 수행해야하는 위치를 알려줄 수 있습니다.

관련 문제