Jcomponent가 완전히 페인트 될 때까지 기다리는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1342932

  •  20-09-2019
  •  | 
  •  

문제

(스윙) jcomponent가 완전히 페인트 될 때까지 기다리는 방법이 필요합니다. 이 실제 문제는 OpenMap 응용 프로그램에서 발생합니다. 작업은 몇 개의 레이어가있는 맵 (Mapbean)을 그리고 해당 맵에서 이미지를 만드는 것입니다.

불행히도, 명확하게 문서화되어 있으며, 이미지 Formatter는 맵에서 현재 상태를 가져 와서 그림을 만들고, 특히지도가 복잡해지면 jcomponent 인 Mapbean 이전에 Pormatter가 불려질 가능성이 있습니다.

이 OpenMAP 응용 프로그램으로 설명되었지만 문제는 매우 일반적이며 스윙과 관련이 있습니다. 지금 당장 고정 된 시간 (1 초)을 기다리지 만 불완전한 맵을 만들 위험이 없어집니다 ...

편집하다

자세한 내용은 Internallz가 Mapbean (Jcomponent 서브 클래스)과 Maphandler를 만드는 (OpenMap) Mappanel을 구성하는 것으로 시작해야합니다. 그런 다음 Maphandler에게 지리적 레이어를 공급하고 프레임 워크는 'Jcomponent Type Mapbean'에 지리적 데이터를 그리기 시작합니다.

맵에 모든 레이어를 추가 한 후 다른 프레임 워크 클래스를 사용하여 JPG 이미지 (또는 이미지 데이터를 보유하는 바이트 [])를 만듭니다. 그리고 이것 기다리지 않으면 문제를 일으킬 수 있습니다.이 '이미지 제작자'는지도 Bean의 현재 상태에서 이미지를 생성하고,이 '이미지 제작자'라고 부르면 일부 맵 레이어가 페인트되지 않습니다. 꽤 짜증나 ...

도움이 되었습니까?

해결책

java.awt.EventQueue.invokeLater 페인트 작동이 완료된 후 작업을 실행할 수 있습니다. 어떤 종류의 비동기 부하를 수행하는 경우 API 특이적일 것입니다 ( MediaTracker 그렇습니다 Image).

다른 팁

오프 화면 버퍼를 사용하여 이미지를 렌더링 할 수도 있습니다.

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

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

 writeToFile(bi);

Jcomponent의 기본 데이터를 Swing의 페인트 사이클과 동기화 해야하는 것 같습니다. jcomponent를 서브 클래스하고 장식 할 수 있습니다 paintComponent() 방법, 당신은 또한 볼 수 있습니다 ImageObserver.imageUpdate(), 그것이 당신이 원하는 것을 말할 것인지 확실하지 않습니다.

public class DrawingCycleAwareComponent extends MyOtherJComponent {

    private final Object m_synchLock = new Object();

    protected void paintComponent(Graphics g) {
        synchronized (m_synchLock) {
            super.paintComponent(g);
        }
    }

    protected void updateData(Object data) {
        if (SwingUtilities.isEventDispatchThread()) {
            reallySetMyData(data);  // don't deadlock yourself if running in swing
        }
        else {
            synchronized (m_synchLock) {
                reallySetMyData(data);
            }
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top