Как я могу обеспечить правильный порядок рисования в Overlaylayout?
-
27-10-2019 - |
Вопрос
Я использую 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);