OverlayLayoutで正しい描画順序を確保するにはどうすればよいですか?

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

質問

私はaを使用しています JPanelOverlayLayout 互いの上に2つの無関係なコンポーネントを描く。具体的には、私は自分の線画を含む透明なコンポーネントを持っています、そしてその下で、私は JMapViewer OpenStreetMapタイルを表示するコンポーネント。これは機能します。

JMapViewerがタイルを非同期にロードする場合を除きます。その場合、それは呼び出します repaint() 負荷が終了したときにそれ自体で、それは私のライン層の上にそれ自体を引きます。 JMapViewerがいつそれ自体を塗り直すことを選択するかを知ることができないため、私のラインレイヤーはこれを知ることができません。

今、私は期待していたでしょう JPanel マップ層が塗り直したときに私のライン層を塗り替えるには、正しい描画順序を知っており、私のライン層を塗り直す必要があることを知っているためです。しかし、それはこれをしません。

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

役に立ちましたか?

解決

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(); 
    }
}

他のヒント

荷重が終了したときにそれ自体にrepaint()を呼び出します、

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

これはどのように依存しますか JMapViewer それ自体を塗り直します。コンテンツを更新するだけで、親は何かが変わったことに気付かないかもしれません。

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

... swingutitivityを介して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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top