Как я могу обеспечить правильный порядок рисования в OverlayLayout? - PullRequest
3 голосов
/ 29 апреля 2011

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 29 апреля 2011

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

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

2 голосов
/ 29 апреля 2011

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 голос
/ 29 апреля 2011

Я не знаю, лучший ли это подход, но я думаю только об этом. Вы можете заменить 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);
1 голос
/ 29 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...