如何将mouseListener添加到MapMarker(MepMarkerDot或MapMarkerCircle)中,使其像按钮一样? 我尝试了this soloution但它可以使整个地图可点击(鼠标事件适用于所有地图)。
答案 0 :(得分:1)
您正在以TrashGod's MouseListener solution开始的正确路径,但您需要添加更多代码,关键部分是,您需要获取用户按下的位置的Point位置, MouseEvent#getPoint()
方法将告诉您的内容,然后基于该信息,以及" active"的范围。组件的区域决定是否响应。类似的东西:
@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内。或者,如果您要检查多个位置,则可能有一组Shapes,在mousePressed中进行迭代,或者(如果有)isPointValid方法,并检查for循环中的包含。
答案 1 :(得分:0)
我发现了这个很好的例子:
它有一个接口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;
}