添加鼠标事件到JMapViewer mapMarker



如何添加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; 
} 

相关内容

  • 没有找到相关文章

最新更新