2009-08-27 4 views
2

(Swing) JComponent가 완전 페인트 될 때까지 기다리는 방법이 필요합니다. 이 실제 문제는 오픈 맵 응용 프로그램에서 발생합니다. 작업은 두 개의 레이어가있는지도 (mapBean)를 그려지도에서 이미지를 만듭니다.JComponent가 완전히 페인트 칠 될 때까지 기다리는 방법?

유감스럽게도 이미지 포맷터는지도에서 현재 상태를 가져 와서 사진을 만듭니다. 특히지도가 복잡해지면 mapBean, JComponent가 호출되기 전에 서식이 부르지 않을 가능성이 있습니다. 그린.

비록이 openmap 응용 프로그램에서 설명되었지만 문제는 매우 일반적이며 아마도 스윙 관련입니다. 지금, 난 그냥 고정 된 시간 (1 초) 기다려야하지만 작성 불완전지도의 위험 ...

편집

좀 더 자세한 사항을 제거하지 않습니다 - 나는의 (a 구축으로 시작해야 OpenMap) MapPanel : internallz는 MapBean (JComponent 서브 클래스)과 MapHandler를 생성합니다. 그런 다음 MapHandler에 지리적 레이어를 제공하고 프레임 워크에서 JComponent 유형 MapBean에 '지리적 데이터'를 페인팅하기 시작합니다.

지도에 모든 레이어를 추가 한 후 다른 프레임 워크 클래스를 사용하여 JPG 이미지 (또는 이미지 데이터를 보유하는 바이트 [])를 만듭니다. 그리고 은 내가 기다리지 않으면 문제를 일으킬 수 있습니다.이 '이미지 크리에이터'는지도 콩의 현재 상태에서 이미지를 만들고,이 '이미지 크리에이터'를 초기에 호출하면 일부지도 레이어가 그려지지 않습니다. 실종. 꽤 귀찮아 ...

+0

. 코드가하는 일을 스케치 할 수 있습니까? – Justin

답변

3

java.awt.EventQueue.invokeLater 페인트 작업이 끝나면 작업을 실행할 수 있습니다. 일종의 비동기로드를 수행하는 경우 API에 따라 다릅니다 (의 경우 MediaTracker).

+0

이것은 또한 작동합니다. – Justin

+0

그게 내가 먼저 시도하는거야. 감사! –

+0

+1은 간단하고 정확한 접근법을 제안합니다. :) –

1

JComponent의 기본 데이터를 Swing의 페인트 사이클로 동기화해야하는 것처럼 들립니다. JComponent를 서브 클래스 화하고 paintComponent() 메소드를 장식 할 수 있습니다. ImageObserver.imageUpdate()을 볼 수도 있습니다. 그러나 원하는 것이 무엇인지 알려주지 않을지는 확실하지 않습니다.

+0

거기에 한 가지 경우에 동기화가 필요하지 않은 이유를 따르지 않습니다. –

+0

호출자가 다른 스레드 또는 SWMET에서 모델의 기본 구성 요소를 업데이트 중일 수 있습니다. 구성 요소를 그리는 동안 setData()를 호출하면 그리기가 끝날 때까지 기다릴 수 있도록 동기화합니다. – Justin

+0

실제 문제는 JComponent 서브 클래스 (mapBean)가 프레임 워크에 의해 생성되고 사용자 정의 구현 (MapBean 서브 클래스)을 제공 할 수 없다고 생각합니다. –

1

당신은 또한 당신의 이미지를 렌더링하는 오프 스크린 버퍼를 사용하여 시도 할 수 있습니다 : 그것은 당신이 실제로 무슨 문제가이 게시물에서 불분명

MapBean map = new MapBean(); 
map.setData(...); 

BufferedImage bi = new BufferedImage(...); 
map.paintComponent(bi.getGraphics()); 

writeToFile(bi); 
+0

유망한 소리지만,지도를 제어 할 수 없습니다.이 작업은 프레임 워크에 의해 수행되며, 단지 지리적 계층을 추가합니다. –

+0

어떤 프레임 워크가 스윙합니까? mapBean이 현재 화면에 보여주고있는 것의 JPEG 또는 다른 것을 만들고 싶습니까? mapBean.paintComponent (offscreenBuffer)를 호출하면 강제로 오프 스크린 버퍼에 그리게됩니다. – Justin

관련 문제