有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何确保覆盖图中的正确绘图顺序?

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

JMapViewer异步加载分幅时除外。在这种情况下,当加载完成时,它会在自身上调用repaint(),并在我的行层上绘制自己。我的行层无法知道这一点,因为它无法知道JMapViewer何时选择重新绘制自己

现在,我希望JPanel在贴图层重新绘制时重新绘制我的线层,因为它知道正确的绘制顺序,并且知道必须重新绘制我的线层。但它不能做到这一点

你将如何解决这个问题


共 (4) 个答案

  1. # 1 楼答案

    ^{}实现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(); 
        }
    }
    
  2. # 2 楼答案

    这取决于JMapViewer如何重新绘制自身。如果它只是更新了它的内容,那么父级甚至可能没有注意到某些内容已经更改

  3. # 3 楼答案

    it calls repaint() on itself when the loading is finished,

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

  4. # 4 楼答案

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

    。。。通过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);