Question

J'utilise un JPanel avec un OverlayLayout pour dessiner deux composants non reliés les uns sur les autres. Plus précisément, j'ai un composant transparent qui contient mes propres dessins au trait, et au-dessous, je me sers d'un composant JMapViewer, qui les tuiles Displays. Cela fonctionne.

Sauf lorsque les charges JMapViewer tuiles de manière asynchrone. Dans ce cas, il appelle repaint() sur lui-même lorsque le chargement est terminé, et il se dessine sur ma couche de ligne. Ma couche de ligne ne peut pas le savoir, car il ne peut pas savoir quand le JMapViewer choisit de se repeindre.

Maintenant j'aurais attendu le JPanel de repeindre ma couche de ligne lorsque la couche de carte repeint, car il connaît l'ordre de dessin correct et sait que ma couche de ligne doit être repeint. Mais il ne le fait pas.

Comment voulez-vous résoudre ce problème?

Était-ce utile?

La solution

JMapViewer outils TileLoaderListener et appelle simplement repaint() lors du chargement est terminé. Vous devriez être en mesure de mettre à jour la carte, puis avant l'événement à votre couche, comme le suggère ci-dessous.

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

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

Autres conseils

il appelle repeindre () sur lui-même lorsque le chargement est terminé,

Appel repeindre () sur le panneau de parent à la place.

Cela dépend de la façon dont l'JMapViewer se redessine. Si juste met à jour son contenu, les parents (s) peut-être pas même avis que quelque chose a changé.

Je ne sais pas si cela est la meilleure approche, mais il est le seul que je peux penser. Vous pouvez remplacer le RepaintManager pour le JMapComponent avec une coutume qui gère également repeint de votre composant superposée. De cette façon, vous pouvez garantir que votre composant obtient toujours repeint superposée dernier.

... le faire à partir du fil d'événements AWT via 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top