Как я могу обеспечить правильный порядок рисования в Overlaylayout?

StackOverflow https://stackoverflow.com/questions/5831152

Вопрос

Я использую JPanel с OverlayLayout Нарисовать два не связанных компонента друг на друга. В частности, у меня есть прозрачный компонент, который содержит мои собственные чертежи линии, и под этим я использую JMapViewer Компонент, который отображает плитки OpenStreetMap. Это работает.

За исключением случаев, когда JMapViewer загружает плитки асинхронно. В этом случае это вызывает repaint() На себя, когда загрузка закончена, и она тянет себя через мой слой линии. Мой слой линии не может этого знать, поскольку он не может знать, когда Jmapviewer решит перекрасить себя.

Теперь я бы ожидал JPanel Чтобы перекрасить мой слой линии, когда перекрашивается слой карты, так как он знает правильный порядок рисования и знает, что мой слой линии должен быть перекрашен. Но это не делает этого.

Как бы вы это решили?

Это было полезно?

Решение

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(); 
    }
}

Другие советы

он вызывает Repaint () на себя, когда загрузка закончена,

Вместо этого вызовите Repaint () на родительской панели.

Это зависит от того, как JMapViewer перекрашивает себя. Если он просто обновляет свой контент, родитель (ы) может даже не заметить, что что -то изменилось.

Я не знаю, является ли это лучшим подходом, но это единственный, о чем я могу подумать. Вы можете заменить Repaintmanager для JMapComponent на пользовательский, который также управляет перекрашенными в ваш наложенный компонент. Таким образом, вы можете гарантировать, что ваш наложенный компонент всегда перекрашивается последним.

... Сделайте это из ветки событий AWT через 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top