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?

¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top