3

(Swing)JComponentが完全にペイントされるまで待つ方法が必要です。この実際の問題は、openmapアプリケーションから発生します。タスクは、いくつかのレイヤーでマップ(mapBean)を描画し、そのマップからイメージを作成することです。

残念ながら、それは明確に文書化されており、画像フォーマッタはマップから現在の状態を取得して画像を作成します。特にマップが複雑になると、JComponentであるmapBeanがペイントされる前にフォーマッタが呼び出されない可能性があります。

このオープンマップアプリケーションで説明されていますが、問題は非常に一般的で、おそらくSwingに関連しています。今のところ、私は一定の時間(1秒)待つだけですが、それは不完全なマップを作成するリスクを排除するものではありません...

編集

詳細-(OpenMap)MapPanelの構築から始めなければなりません。これは、internallzがMapBean(JComponentサブクラス)とMapHandlerを作成します。次に、MapHandlerに地理レイヤーをフィードすると、フレームワークはJComponentタイプのMapBeanに地理データのペイントを開始します。

マップにすべてのレイヤーを追加した後、別のフレームワーククラスを使用してJPG画像(または画像データを保持するbyte [])を作成します。そして、これは私が待たなければ問題を引き起こす可能性があります:この「イメージクリエーター」はマップBeanの現在の状態からイメージを作成し、この「イメージクリエーター」を早期に呼び出すと、一部のマップレイヤーがペイントされずに欠落します。かなり迷惑...

4

3 に答える 3

4

java.awt.EventQueue.invokeLaterペイント操作が終了した後にタスクを実行できるようになります。ある種の非同期ロードを実行している場合は、API固有になります(の場合と同様MediaTrackerImage

于 2009-08-27T18:38:58.420 に答える
1

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);
            }
        }
    }
}
于 2009-08-27T18:38:53.333 に答える
1

また、オフスクリーンバッファを使用して画像をレンダリングしてみることもできます。

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

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

 writeToFile(bi);
于 2009-08-27T19:17:41.383 に答える