Domanda

Sto usando un JPanel con un OverlayLayout per disegnare due componenti non correlati uno sopra l'altro. In particolare, ho un componente trasparente che contiene i miei disegni di linea, e sotto quello, sto usando un JMapViewer Componente, che visualizza le piastrelle OpenStreetMap. Questo funziona.

Tranne quando il jmapviewer carica le tessere in modo asincrono. In tal caso, chiama repaint() su se stesso quando il caricamento è finito e si basa sul mio livello di linea. Il mio livello di linea non può saperlo, dal momento che non può sapere quando Jmapviewer sceglie di ridipingere se stesso.

Ora mi sarei aspettato il JPanel Per ridipingere il mio livello di linea quando il livello della mappa riconfigge, poiché conosce l'ordine di disegno corretto e sa che il mio livello di linea deve essere ridipinto. Ma non lo fa.

Come risolveresti questo?

È stato utile?

Soluzione

JMapViewer strumenti TileLoaderListener E semplicemente chiama repaint() Al termine del caricamento. Dovresti essere in grado di aggiornare la mappa e quindi inoltrare l'evento al tuo livello, come suggerito di seguito.

MyViewer map = new MyViewer();
...
private class MyViewer extends JMapViewer {

    @Override
    public void tileLoadingFinished(Tile tile, boolean success) {
        super.tileLoadingFinished(tile, success);
        lineLayer.repaint(); 
    }
}

Altri suggerimenti

Chiama riverniciare () su se stesso al termine del caricamento,

Chiama invece () sul pannello genitore.

Questo dipende da come il JMapViewer Repintes stesso. Se aggiorna il suo contenuto, i genitori potrebbero non notare nemmeno che qualcosa è cambiato.

Non so se questo è l'approccio migliore, ma è l'unico a cui riesco a pensare. È possibile sostituire il RIPLINTMANAGER per JMAPComponent con uno personalizzato che gestisce anche i rimborsi del tuo componente sovrapposto. In questo modo, puoi garantire che il tuo componente sovrapposto venga sempre ridipinto per ultimo.

... Fallo dal thread di eventi AWT tramite 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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top