如何确保OverlayLayout中的正确绘图顺序?

时间:2011-04-29 10:59:48

标签: java swing repaint jmapviewer

我正在使用JPanelOverlayLayout来绘制两个不相关的组件。具体来说,我有一个透明组件,其中包含我自己的线条图,在其下方,我使用的是JMapViewer组件,它显示了OpenStreetMap图块。这很有效。

除非JMapViewer异步加载切片。在这种情况下,它在加载完成时调用repaint(),并将其自身绘制在我的线图层上。我的线图层无法知道这一点,因为它无法知道JMapViewer何时选择重绘自己。

现在我希望JPanel在地图图层重新绘制时重新绘制我的线条图层,因为它知道正确的绘制顺序并且知道我的线条图层必须重新绘制。但它没有这样做。

你会如何解决这个问题?

4 个答案:

答案 0 :(得分: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(); 
    }
}

答案 1 :(得分:2)

  

在加载完成后调用repaint(),

改为在父面板上调用repaint()。

答案 2 :(得分:1)

这取决于JMapViewer如何重新绘制自己。如果它只更新其内容,父母甚至可能不会注意到某些内容已经发生变化。

答案 3 :(得分: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);