在JMapViewer中动态更新标记

时间:2012-10-15 19:10:19

标签: java swing jframe markers jmapviewer

Hello Stack Overflow社区,

我是一个Java新手,我正在做一个简单的java项目,我从一个(动态)源获取坐标(lat和lon),并使用JMapViewer(是,而不是JXMapViewer)在地图上显示标记。我已将所有坐标放在两个ArrayList中。 它看起来像是:

for(int i = 0; i < latArrayList.size(); i++){
    map.addMapMarker(new MapMarkerDot((double)latArrayList.get(i), (double)longArrayList.get(i)));
}

编辑:map是一个jMapViewer对象。

它工作得很好。 问题是我需要使用Timer每隔20秒刷新一次这个地图,我找到的唯一方法是关闭并打开地图,如下所示:

    theMap.setVisible(false);
    theMap  = new Map();
    theMap.setVisible(true); 

编辑:theMap是一个对象(jFrame而不是jMapViewer)我在main函数中创建(就像在demo中一样)而且我不能在它上面使用addMapMarker(比如theMap.addMapMarker(150.2,150.2))

而且,你可以想象这很烦人(窗口每20秒关闭并打开,之前的'浏览'会话丢失)。那么有没有办法刷新它?通过动态添加标记还是只刷新内容?

非常感谢。

2 个答案:

答案 0 :(得分:2)

我从未使用过该API,但看起来theMap.removeAllMapMarkers();可以解决问题。然后,您可以再次开始添加新标记。

关于你的循环,如果你用泛型声明你的列表,你就不需要强制转换为double:

List<Double> latArrayList = new ArrayList<Double> ();
latArrayList.add(125.87); //or whatever

for(int i = 0; i < latArrayList.size(); i++){
    theMap.addMapMarker(new MapMarkerDot(latArrayList.get(i), longArrayList.get(i)));
}

答案 1 :(得分:2)

我看到两种方法:

  • 维护现有MapMarker个实例的集合,并使用提供的不可变removeMapMarker()实现使用addMapMarker()后跟MapMarkerDot。两种方法都会调用repaint()

  • 实施MapMarker界面以创建MutableMapMarkerDot;根据需要添加任意数量的实例;更新坐标 in situ 并在repaint()听众中调用javax.swing.Timer