Wie kann ich in einem OverlayLayout die korrekte Zeichnungsreihenfolge sicherstellen?
-
27-10-2019 - |
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?
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);