Frage

Ich benutze a JPanel mit einem OverlayLayout Zeichnen Sie zwei nicht verwandte Komponenten übereinander. Insbesondere habe ich eine transparente Komponente, die meine eigenen Zeichnungen enthält, und darunter benutze ich a JMapViewer Komponente, in der OpenStreetmap -Fliesen angezeigt werden. Das funktioniert.

Außer wenn der JMAPViewer Fliesen asynchron lädt. In diesem Fall ruft es auf repaint() Wenn die Belastung beendet ist und sich selbst über meine Zeilenschicht zieht. Meine Zeilenschicht kann dies nicht wissen, da sie nicht wissen kann, wann der JMAPViewer sich dafür entscheidet, sich neu zu streichen.

Jetzt hätte ich das erwartet JPanel Um meine Zeilenebene neu zu streichen, wenn die Kartenschicht neu streicht, da sie die richtige Zeichnungsreihenfolge kennt und weiß, dass meine Zeilenschicht neu gestrichen werden muss. Aber das tut es nicht.

Wie würdest du das lösen?

War es hilfreich?

Lösung

JMapViewer Geräte TileLoaderListener und ruft einfach an repaint() Beim Laden ist fertig. Sie sollten in der Lage sein, die Karte zu aktualisieren und das Ereignis dann an Ihre Ebene weiterzuleiten, wie unten vorgeschlagen.

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

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

Andere Tipps

Es ruft Repaint () auf sich selbst auf, wenn die Belastung beendet ist,

Rufen Sie stattdessen Repaint () auf das übergeordnete Gremium an.

Dies hängt davon ab, wie die JMapViewer neu streicht. Wenn es nur den Inhalt aktualisiert, bemerken die Eltern möglicherweise nicht einmal, dass sich etwas geändert hat.

Ich weiß nicht, ob dies der beste Ansatz ist, aber es ist das einzige, an das ich denken kann. Sie können den RepaintManager für das JMAPComponent durch eine benutzerdefinierte ersetzen, die auch Repaints Ihrer überlagerten Komponente verwaltet. Auf diese Weise können Sie garantieren, dass Ihre überlagerte Komponente zuletzt immer neu gestrichen wird.

... Machen Sie dies aus dem AWT -Event -Thread über 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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top