¿Cómo puedo asegurar el orden de dibujo correcto en un superpuesto?
-
27-10-2019 - |
Pregunta
Estoy usando un JPanel
con un OverlayLayout
para dibujar dos componentes no relacionados uno encima del otro. Específicamente, tengo un componente transparente que contiene mis propios dibujos de línea, y debajo de eso, estoy usando un JMapViewer
Componente, que muestra los mosaicos OpenStreetMap. Esto funciona.
Excepto cuando el JMapViewer carga azulejos de forma asincrónica. En ese caso, llama repaint()
sobre sí mismo cuando la carga está terminada y se dibuja sobre mi capa de línea. Mi capa de línea no puede saber esto, ya que no puede saber cuándo el JMapViewer elige volver a pintar.
Ahora hubiera esperado el JPanel
Para volver a pintar mi capa de línea cuando la capa de mapa repinta, ya que sabe la orden de dibujo correcta y sabe que mi capa de línea debe ser repintada. Pero no hace esto.
Como resolverias esto?
Solución
JMapViewer
implementos TileLoaderListener
y simplemente llamadas repaint()
Cuando se termina la carga. Debería poder actualizar el mapa y luego reenviar el evento a su capa, como se sugiere a continuación.
MyViewer map = new MyViewer();
...
private class MyViewer extends JMapViewer {
@Override
public void tileLoadingFinished(Tile tile, boolean success) {
super.tileLoadingFinished(tile, success);
lineLayer.repaint();
}
}
Otros consejos
llama a repint () sobre sí mismo cuando la carga está finalizada,
Llame a Repaint () en el panel principal en su lugar.
Esto depende de cómo el JMapViewer
Repinte a sí mismo. Si solo actualiza su contenido, los padres ni siquiera notan que algo ha cambiado.
No sé si este es el mejor enfoque, pero es el único en el que puedo pensar. Puede reemplazar el RepaintManager por el JMAPCOCOMPONENT con uno personalizado que también administra el repinte de su componente superpuesto. De esa manera, puede garantizar que su componente superpuesto siempre sea repintado por último.
... Haz esto desde el hilo del evento AWT a través de SwingUtility
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);