Hallo und ein Freues Neues Jahr!
Ich untersuche seit einiger Zeit einen Phänomen, finde jedoch leider keine Lösung.
Gegeben:
- eine JXMapView wird auf den ContentPane eines JFrames
- in diese Map kann eine Liste von WayPoints dargestellt werden
- diese WayPoints werden so gerendert, dass nicht nur Punkt/Label, sondern auch ein Polygon (Fläche) dargestellt wird
- die Karte kann dabei frei bewegt und skaliert werden
- alles in einem Swing-Framework, der auch uU weitere Fenster (JWindow) mit dem JFRame als Parent aufweist
Problem:
Wenn man, mit dargestellten Polygonen auf der Karte, diese so platziert, dass der Polygon über den sichtbaren Kartenrand hinausgeht, und dabei Sachen macht wie einen der Fenster (JFrame oder JWindows) verschiebt, so werden die unsichtbaren Polygongrenzen über alles sichtbar.
Hat jemand eine Ahnung wo man nachsuchen könnte?
Ich hätte das Problem auch so gelöst, dass ich meinen Polygon selber zurecht schneiden würde, jedoch habe ich keine Möglichkeit gefunden meinen WayPoint neuzeichnen zu lassen, zum Beispiel von einem MouseListener.mouseRelease auf der Karte.
Waypoints
So sieht dann der Fehlerfall aus.
Ich untersuche seit einiger Zeit einen Phänomen, finde jedoch leider keine Lösung.
Gegeben:
- eine JXMapView wird auf den ContentPane eines JFrames
- in diese Map kann eine Liste von WayPoints dargestellt werden
- diese WayPoints werden so gerendert, dass nicht nur Punkt/Label, sondern auch ein Polygon (Fläche) dargestellt wird
- die Karte kann dabei frei bewegt und skaliert werden
- alles in einem Swing-Framework, der auch uU weitere Fenster (JWindow) mit dem JFRame als Parent aufweist
Problem:
Wenn man, mit dargestellten Polygonen auf der Karte, diese so platziert, dass der Polygon über den sichtbaren Kartenrand hinausgeht, und dabei Sachen macht wie einen der Fenster (JFrame oder JWindows) verschiebt, so werden die unsichtbaren Polygongrenzen über alles sichtbar.
Hat jemand eine Ahnung wo man nachsuchen könnte?
Ich hätte das Problem auch so gelöst, dass ich meinen Polygon selber zurecht schneiden würde, jedoch habe ich keine Möglichkeit gefunden meinen WayPoint neuzeichnen zu lassen, zum Beispiel von einem MouseListener.mouseRelease auf der Karte.
Waypoints
Code:
...
posSet = Collections.synchronizedSet(new TreeSet<Waypoint>());
map = mapKit.getMainMap();
WaypointPainter<JXMapViewer> painter = new WaypointPainter<JXMapViewer>();
painter.setWaypoints(posSet);
painter.setRenderer(new WaypointRenderer() {
public boolean paintWaypoint(Graphics2D g, JXMapViewer map, Waypoint wp) {
DHPBaseGlobalPositionModel gpwp = (DHPBaseGlobalPositionModel) wp;
g = (Graphics2D) g.create();
Point2D ptC = map.getTileFactory().geoToPixel(gpwp.getPosition(), map.getZoom());
if (gpwp.isPolygon()){
//create a polygon
Polygon poly = new Polygon();
for(Waypoint wyp : gpwp.getPolygon()) {
Point2D pt = map.getTileFactory().geoToPixel(wyp.getPosition(), map.getZoom());
poly.addPoint((int)(pt.getX() - ptC.getX()), (int)(pt.getY() - ptC.getY()));
}
//do the drawing
g.setClip(poly);
g.setStroke(STROKE_IN);
g.setColor(COLOR_IN);
g.draw(poly);
g.setClip(null);
g.setStroke(STROKE_OUT);
g.setColor(COLOR_OUT);
g.draw(poly);
}
//draw tab
Point2D ptL = map.getTileFactory().geoToPixel(gpwp.getLabelGeoPosition(), map.getZoom());
int x = (int)(ptL.getX() - ptC.getX()), y = (int)(ptL.getY() - ptC.getY());
Polygon triangle = new Polygon();
triangle.addPoint(x,y);
triangle.addPoint(x + 11, y + 11);
triangle.addPoint(x - 11, y + 11);
g.setPaint(farbSchema.getBackgroundColor());
g.fill(triangle);
g.setPaint(farbSchema.getGridColor());
g.draw(triangle);
int width = (int) g.getFontMetrics().getStringBounds(gpwp.getPlace(), g).getWidth();
g.setStroke(DHPLayout.STROKE1);
g.setPaint(farbSchema.getBackgroundColor());
g.fillRoundRect(x - width/2 - 5, y + 10, width+10, 20, 10, 10);
g.setPaint(farbSchema.getGridColor());
g.drawRoundRect(x - width/2 - 5, y + 10, width+10, 20, 10, 10);
g.setPaint(farbSchema.getTextColor());
g.drawString(gpwp.getPlace(), x - width/2, y + 26); //text
g.dispose();
return false;
}
});
map.setOverlayPainter(painter);
...
So sieht dann der Fehlerfall aus.