JComponentのが完全に塗装されるまで待機するには?
質問
私は(スイング)のJComponentが完全にペイントされるまで待機する方法が必要です。この実際の問題はopenmapアプリケーションから生じる:タスクは、層のカップルとマップ(mapBean)を描画し、そのマップから画像を作成することである
残念ながら、それは明確に文書化だ、mapBean、JComponentの前に呼び出さフォーマッタイストは、塗装されていることをマップは、複雑になる場合は特に、画像フォーマッタは、画像を作成するために、マップから現在の状態をとり、そしてチャンスがありますます。
このopenmapアプリケーションと説明したが、、問題は非常に一般的であり、おそらく関連スイング。今、私は一定時間(1秒)を待つが、それは不完全なマップを作成する危険性を排除しない...
編集
いくつかの詳細については、 - 私はMapBean(JComponentのサブクラス)を作成internallz(OpenMap)MapPanel、およびMapHandlerを構築して開始する必要があります。それから私は、地理的なレイヤーでMapHandlerを養うとフレームワークは、JComponentのタイプMapBean「オン」地理データを塗る開始します。
マップへのすべての層を追加した後、私はJPG画像(画像データを保持するバイト[]または)を作成するために、別のフレームワーククラスを使用します。そして、のこのの私は待っていない場合は、問題を引き起こす可能性があります。この「イメージの作成者は、」マップBeanの現在の状態からの画像を作成し、私はこの「イメージクリエータ」を呼び出した場合、早期に、いくつかのマップレイヤは、塗装や欠落していません。かなり迷惑な...
解決
java.awt.EventQueue.invokeLater
はペイント操作が終了した後にタスクを実行できるようになります。それは非同期ロードのいくつかの種類を行っている場合、それは(MediaTracker
がImage
の場合と同様に)APIの特定になります。
他のヒント
また、中にあなたの画像をレンダリングするためにオフスクリーンバッファを使用してみてください
MapBean map = new MapBean();
map.setData(...);
BufferedImage bi = new BufferedImage(...);
map.paintComponent(bi.getGraphics());
writeToFile(bi);
これが鳴ります。あなたは、私はそれが何をしたいあなたに伝えるために起こっているのかはわからないけれども、あなたも、paintComponent()
に見えるかもしれません、あなたのJComponentのサブクラスを作成し、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);
}
}
}
}