我正在使用JPanel
和OverlayLayout
来绘制两个不相关的组件。具体来说,我有一个透明组件,其中包含我自己的线条图,在其下方,我使用的是JMapViewer
组件,它显示了OpenStreetMap图块。这很有效。
除非JMapViewer异步加载切片。在这种情况下,它在加载完成时调用repaint()
,并将其自身绘制在我的线图层上。我的线图层无法知道这一点,因为它无法知道JMapViewer何时选择重绘自己。
现在我希望JPanel
在地图图层重新绘制时重新绘制我的线条图层,因为它知道正确的绘制顺序并且知道我的线条图层必须重新绘制。但它没有这样做。
你会如何解决这个问题?
答案 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);