Merkwürdige Artefakte bei JXMapView

barsiq

Mitglied
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
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.
 

Anhänge

  • Foto2.JPG
    Foto2.JPG
    173,8 KB · Aufrufe: 25
Lösung gefunden, danke.

Code:
				Rectangle bounds = map.getViewportBounds();
				
				bounds.x -= ptCenter.getX();
				bounds.y -= ptCenter.getY();
				bounds.width --;
				bounds.height --;
				
				g.setClip(bounds);

Auf weitere Clippings muss bei dieser Lösung leider verzichtet werden, eine theoretisch sauberere Lösung, über g zu clippen, macht die gleichen Artefakte.
 

Neue Beiträge

Zurück