3

と を使用しJPanelて、OverlayLayout2 つの無関係なコンポーネントを重ねて描画しています。具体的には、独自の線画を含む透明なコンポーネントがあり、その下で、JMapViewerOpenStreetMap タイルを表示するコンポーネントを使用しています。これは機能します。

JMapViewer がタイルを非同期的にロードする場合を除きます。その場合、読み込みが完了すると自分自身を呼び出しrepaint()、自分の線画層の上に自分自身を描画します。JMapViewer がいつ自分自身を再描画することを選択したかを知ることができないため、私の行レイヤーはこれを知ることができません。

JPanelこれで、マップ レイヤーが再描画されたときに線レイヤーが再描画されることを期待していました。しかし、これはしません。

これをどのように解決しますか?

4

4 に答える 4

2

JMapViewer実装し、ロードが終了したときにTileLoaderListener呼び出すだけです。repaint()以下に示すように、マップを更新して、イベントをレイヤーに転送できるはずです。

MyViewer map = new MyViewer();
...
private class MyViewer extends JMapViewer {

    @Override
    public void tileLoadingFinished(Tile tile, boolean success) {
        super.tileLoadingFinished(tile, success);
        lineLayer.repaint(); 
    }
}
于 2011-04-29T12:19:42.297 に答える
2

ロードが完了すると、自分自身で repaint() を呼び出します。

代わりに、親パネルで repaint() を呼び出します。

于 2011-04-29T14:19:39.273 に答える
1

これが最善のアプローチかどうかはわかりませんが、私が考えることができるのはそれだけです。JMapComponentのRepaintManagerを、オーバーレイされたコンポーネントの再ペイントも管理するカスタムマネージャーに置き換えることができます。そうすれば、オーバーレイされたコンポーネントが常に最後に再描画されることを保証できます。

...SwingUtilitiesを介してAWTイベントスレッドからこれを実行します

RepaintManager myManager = new RepaintManager() {
   public void  addDirtyRegion(JComponent c, int x, int y, int w, int h) {
....implemnt code here to guarentee your top level component gets repainted whenever 'c' is the JMapComponent
   }
}

RepaintManager.setCurrentManager(myManager);
于 2011-04-29T11:52:34.227 に答える
1

これは、JMapViewer再描画自体の方法によって異なります。コンテンツを更新するだけでは、保護者は何かが変更されたことに気付かない可能性があります。

于 2011-04-29T11:04:12.700 に答える