2011-04-29 35 views
3

我正在使用JPanelOverlayLayout来绘制两个不相关的组件。具体来说,我有一个透明的组件,其中包含我自己的线条图,在其下面,我使用了一个显示OpenStreetMap图块的JMapViewer组件。这工作。如何确保OverlayLayout中的正确绘图顺序?

除JMapViewer异步加载tile以外。在这种情况下,当加载完成时它自己调用repaint(),并且它通过我的线路层自行绘制。我的线路层无法知道这一点,因为它无法知道JMapViewer何时选择重新绘制自己。

现在我会预计JPanel重绘我的线路层时,地图层重绘,因为它知道正确的绘图顺序,并知道我的线路层必须重新绘制。但它不这样做。

你会如何解决这个问题?

回答

2

JMapViewer实现TileLoaderListener从AWT事件线程做到这一点,在加载完成时只需调用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

这取决于JMapViewer如何重新绘制自己。如果它只是更新其内容,那么父母可能甚至不会注意到有什么变化。

1

我不知道这是否是最好的方法,但它是我能想到的唯一方法。您可以使用自定义的RepaintManager替换JMapComponent的RepaintManager,该自定义控件还可以管理覆盖组件的重绘。这样,您可以保证您的覆盖组件总是最后重新绘制。

...通过SwingUtilities的

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); 
+0

谢谢。我现在正在处理*另一个*地图查看器组件,因为垃圾回收的方法不起作用(因为它没有侦听器的钩子),但是你的方法却行。 – 2011-08-03 15:33:15

2

当加载完成后调用重绘()本身,

调用重绘()父面板代替。