Java Swing JxMapViewer:聚焦对象并设置相应的缩放级别

Java Swing JxMapViewer:聚焦对象并设置相应的缩放级别,java,swing,dictionary,focus,jxmapviewer,Java,Swing,Dictionary,Focus,Jxmapviewer,我正在尝试将JxMapViewer集成到我的swing应用程序中 我已在地图上两个方向点之间画了一条线。现在,我希望实现以下功能: 无论我在地图上的什么位置,无论设置了什么缩放级别,只要我单击按钮(或某些外部事件),焦点都应该转移到我绘制的直线上(即间接地在两个航路点上) 其次,应设置缩放级别,使包含这两个航路点的地图部分可见 我看到在JxMApViewer类中有getViewportBounds方法。同样,我们没有setViewportBounds。在这种情况下,我们可以计算出一个包含这两个航

我正在尝试将JxMapViewer集成到我的swing应用程序中

我已在地图上两个方向点之间画了一条线。现在,我希望实现以下功能:

无论我在地图上的什么位置,无论设置了什么缩放级别,只要我单击按钮(或某些外部事件),焦点都应该转移到我绘制的直线上(即间接地在两个航路点上)

其次,应设置缩放级别,使包含这两个航路点的地图部分可见

我看到在
JxMApViewer
类中有
getViewportBounds
方法。同样,我们没有
setViewportBounds
。在这种情况下,我们可以计算出一个包含这两个航路点的矩形并设置它

任何暗示都将不胜感激


我已将现有的
calculateZoomFrom
方法修改为:

int zoom = mainMap.getZoom();
Rectangle2D inner = generateBoundedRectangleForLine(positionSet, mainMap.getZoom());

int count = 0;
Rectangle outer = mainMap.getViewportBounds();
while(!outer.contains(inner) || (outer.contains(inner) && !(inner.getHeight() >= mainMap.getHeight() - 50))) {
    Point2D center = new Point2D.Double(
            inner.getX() + inner.getWidth()/2,
            inner.getY() + inner.getHeight()/2);
    GeoPosition px = mainMap.getTileFactory().pixelToGeo(center,zoom);
    mainMap.setCenterPosition(px);
    count++;
    if(count > 30) break;
    if(outer.contains(inner)) {
        if (!(inner.getHeight() >= mainMap.getHeight() - 50)) {
            zoom = zoom - 1;
            if(zoom < 1) {
                break;
            }
        } else {
            break;
        }

    } else {
        zoom = zoom + 1;
        if(zoom > 15) {
            break;
        }
    }

    mainMap.setZoom(zoom);
    inner = generateBoundedRectangleForLine(positionSet, zoom);
}
int zoom=mainMap.getZoom();
矩形2D内部=generateBoundedRectangleForLine(位置集,mainMap.getZoom());
整数计数=0;
矩形外部=mainMap.getViewportBounds();
而(!outer.contains(internal)| |(outer.contains(internal)&&!(inner.getHeight()>=mainMap.getHeight()-50))){
Point2D center=新的Point2D.Double(
内部.getX()+内部.getWidth()/2,
内部.getY()+内部.getHeight()/2);
地理位置px=mainMap.getTileFactory().pixelToGeo(居中,缩放);
主地图设置中心位置(px);
计数++;
如果(计数>30)中断;
if(外部包含(内部)){
如果(!(inner.getHeight()>=mainMap.getHeight()-50)){
缩放=缩放-1;
如果(缩放<1){
打破
}
}否则{
打破
}
}否则{
缩放=缩放+1;
如果(缩放>15){
打破
}
}
mainMap.setZoom(缩放);
内部=generateBoundedRectangleForLine(位置设置、缩放);
}

但是它不起作用。

您可以从
ActionListener
调用
JXMapViewer.setCenterPosition(GeoPosition-GeoPosition)


您必须自己计算适当的缩放级别(据我所知,JXMapViewer没有提供任何这方面的功能)。由于您知道航路点的坐标,因此计算边界框和设置适当的缩放级别应该不会有问题。

您可以从
ActionListener
调用
JXMapViewer.setCenterPosition(地理位置地理位置)


您必须自己计算适当的缩放级别(据我所知,JXMapViewer没有提供任何这方面的功能)。由于您知道航路点的坐标,因此计算边界框和设置适当的缩放级别应该不是问题。

我找到了解决方案。解决方案是将缩放级别设置为最低级别,然后调用calculateZoomFrom方法。

我找到了解决方案。解决方案是将缩放级别设置为最低级别,然后调用calculateZoomFrom方法。

JXMapViewer提供了calculateZoomFrom(设置位置)方法,它可以帮助我将焦点移到中心,并调整缩放级别,使我的航路点位于视图端口边界内,而对于视图端口边界,它会创建外部矩形。对于航路点边界,它创建内部矩形。现在,即使航路点在视图端口边界内(因此满足outer.contains(internal)条件),并且缩放处于某个最大级别,因此我的航路点内部矩形不完全适合视图端口边界,JxMapViewer什么也不做。在上面的例子中,JxMapViewer假设航路点在视图端口边界内,而不管缩放级别如何,并在那里停止。我正在努力解决这个问题。但是运气不好。根据经验,我知道JXMapViewer组件中有一些未修复的bug。您是否尝试过下载源代码并使用调试器(例如Eclipse中的调试器)逐步检查它,以了解它为什么没有达到您期望的效果?是的,我做到了。请参考我在单独答案中编写的代码,因为我无法将代码作为注释发布。JXMapViewer提供了calculateZoomFrom(设置位置)方法,该方法帮助我将焦点转移到中心,并调整缩放级别,以便我的航路点位于视口边界内,对于视口边界,它会创建外部矩形。对于航路点边界,它创建内部矩形。现在,即使航路点在视图端口边界内(因此满足outer.contains(internal)条件),并且缩放处于某个最大级别,因此我的航路点内部矩形不完全适合视图端口边界,JxMapViewer什么也不做。在上面的例子中,JxMapViewer假设航路点在视图端口边界内,而不管缩放级别如何,并在那里停止。我正在努力解决这个问题。但是运气不好。根据经验,我知道JXMapViewer组件中有一些未修复的bug。您是否尝试过下载源代码并使用调试器(例如Eclipse中的调试器)逐步检查它,以了解它为什么没有达到您期望的效果?是的,我做到了。请参考我在单独答案中编写的代码,因为我无法将代码作为注释发布。