如何添加mousellistener到MapMarker (MepMarkerDot或MapMarkerCircle),使其像按钮?我尝试了这个解决方案,但它使整个地图可点击(鼠标事件适用于所有地图)。
从TrashGod的MouseListener解决方案开始是正确的,但你需要添加更多的代码,关键部分是,你需要获得用户按下的点位置,MouseEvent#getPoint()
方法将告诉你的东西,然后基于该信息,以及组件的"活动"区域的边界决定是否响应。比如:
@Override
public void mousePressed(MouseEvent e) {
Point p = e.getPoint(); // this is where the user pressed
if (isPointValid(p)) {
// do something
}
System.out.println(map.getPosition(e.getPoint()));
}
private boolean isPointValid(Point p) {
// here you have code to decide if the point was pressed in the area of interest.
}
注意,如果你的代码使用Shape派生对象,如Ellipse2D或Rectangle2D,你可以使用它们的contains(Point p)
方法很容易地告诉你点按是否在Shape内。或者,如果您想要检查几个位置,您可能有一个形状集合,在mousePressed或(如果有的话)isPointValid方法中迭代它们,并检查for循环中的包含性。
我发现了这个很好的例子:
https://www.programcreek.com/java-api-examples/index.php?source_dir=netention-old1-master/swing/automenta/netention/swing/map/Map2DPanel.java它有一个接口MarkerClickable和它自己的LabeledMarker实现MapMarker和MarkerClickable:
public boolean onClick(final Coordinate p, final MouseEvent e) {
for (final MapMarker x : getMap().getMapMarkerList()) {
if (x instanceof MarkerClickable) {
final MarkerClickable mc = (MarkerClickable)x;
final Rectangle a = mc.getClickableArea();
if (a == null)
continue;
if (a.contains(e.getPoint())) {
mc.onClicked(e.getPoint(), e.getButton());
return false;
}
}
}
return true;
}