OverlayLayoutで正しい描画順序を確保するにはどうすればよいですか?
-
27-10-2019 - |
質問
私はaを使用しています JPanel
で OverlayLayout
互いの上に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);