将鼠标事件添加到JMapViewer mapMarker

时间:2015-08-17 15:01:17

标签: java swing awt jmapviewer

如何将mouseListener添加到MapMarker(MepMarkerDot或MapMarkerCircle)中,使其像按钮一样? 我尝试了this soloution但它可以使整个地图可点击(鼠标事件适用于所有地图)。

2 个答案:

答案 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)

我发现了这个很好的例子:

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; 
}