3

我正在使用 a JPanelwith anOverlayLayout在彼此之上绘制两个不相关的组件。具体来说,我有一个包含我自己的线条图的透明组件,在它下面,我使用了一个JMapViewer显示 OpenStreetMap 瓷砖的组件。这行得通。

除非 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

这取决于JMapViewer重绘本身的方式。如果它只是更新其内容,父母可能甚至不会注意到某些事情发生了变化。

于 2011-04-29T11:04:12.700 回答
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 回答