标签: jmapviewer

在JMapViewer中绘制两个地理点之间的直线

我正在使用Java中的OpenStreet Maps和JMap Viwer http://wiki.openstreetmap.org/wiki/JMapViewer我可以加载地图和一切正常但我不知道如何在纬度的两点之间画一条线和经度.

任何人都知道绘制这种线条的功能吗?

谢谢.

java swing openstreetmap jmapviewer

4
推荐指数
1
解决办法
4971
查看次数

带有匿名EventListener的JPanel - 为什么GC不会破坏监听器?

我一直在仔细阅读JMapViewer的开源代码.如果有其他人希望查看它,请检查SVN.

简而言之,主要类是JMapViewer,它是一个扩展JPanel.还有一种叫非常重要的一类DefaultMapController充当MouseListener主类.

我注意到的第一个奇怪的事情是观众没有对控制器的引用.该JMapViewer构造器实例的一个匿名实例DefaultMapController,就像这样:

public JMapViewer() {
    // other stuff
    new DefaultMapController(this);
}
Run Code Online (Sandbox Code Playgroud)

在我看来这是一个糟糕的设计选择,因为控制器有很多方法(选项,切换等 - 下面显示的例子),现在根本无法访问,那么它们有什么用呢?

public void setMovementMouseButton(int movementMouseButton) {
    // changes which mouse button is used to move the map
}
Run Code Online (Sandbox Code Playgroud)

控制器确实有一个对查看器的引用,如上面的第一个片段所示,这是它能够控制的方式.

然而,那时我想到的东西更怪异!如果这个监听器的匿名实例没有引用,为什么它甚至可以存活?GC不应该迅速摧毁它吗?或者GC是否足够聪明,知道引用live的侦听器类也JComponent必须保持活动才能正常工作,即使它因某些奇怪的原因没有名称?

那么,有两个真正的问题:

  • 为什么GC不会破坏对象?
  • 这确实是一个糟糕的设计选择,还是有一些方法我不知道从实例化查看器的类访问控制器?

我想为这个开源库做贡献,我改变的第一个想法是改变JMapViewer类以使一个字段引用其控制器,并更改构造函数以将当前的匿名控制器分配给这个新字​​段.但是,我想确保我不会无知地遗漏某些东西.我在整个代码库中搜索了文本DefaultMapController,它只出现在它自己的类定义中,以及JMapViewer构造函数中的匿名实例化中.


编辑:

确实有一种方法可以通过使用该java.awt.Component方法来访问匿名侦听器getMouseListeners().从技术上讲,在我的应用程序中,我可以搜索此集合的实例DefaultMapController,并使用它来访问我需要用来更改控制器选项的方法.

但是,为了扮演魔鬼的拥护者,如果我按照原始想法并给地图作为其控制器的参考,现在我有一种循环参考(地图知道控制器和控制器知道地图).这是一个坏主意吗?

java swing garbage-collection event-listener jmapviewer

2
推荐指数
1
解决办法
772
查看次数

如何在JMapViewer中将工具提示添加到MapMarker

我想要一个添加ToolTip到自定义MapMarkerJMapViewer。但是,取消搜索并不能帮助我解决这个问题。

自定义MapMarker为:

public class MapMarkerUnit extends MapObjectImpl implements MapMarker
Run Code Online (Sandbox Code Playgroud)

绘制方法的覆盖是

public void paint(Graphics g, Point position, int radio) {
    String filename = "marker.png";
    //System.out.print(filename);
    BufferedImage x = null;
    try {
        x = ImageIO.read(getClass().getResource(filename));
    } catch (IOException ex) {
        Logger.getLogger(MapMarkerUnit.class.getName()).log(Level.SEVERE, null, ex);
    }

    g.drawImage(x, position.x-16, position.y-37,null);

    //if(getLayer()==null||getLayer().isVisibleTexts()) paintText(g, new       Point(position.x+20,position.y));
}
Run Code Online (Sandbox Code Playgroud)

感谢您提供的任何帮助。

java jmapviewer

2
推荐指数
1
解决办法
1159
查看次数