java JMapViewer,绘制到OSM并避免双重调用MouseClick事件
假设Map3是以下类:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JPanel;
import org.openstreetmap.gui.jmapviewer.Coordinate;
import org.openstreetmap.gui.jmapviewer.DefaultMapController;
import org.openstreetmap.gui.jmapviewer.JMapViewer;
import org.openstreetmap.gui.jmapviewer.MapPolygonImpl;
public class Map3 {
private JPanel p;
private JMapViewer map;
private double lat, lon;
public Map3()
{
p = new JPanel();
map = new JMapViewer();
p.setLayout(new BorderLayout());
new DefaultMapController(map) {
@Override
public void mouseClicked(MouseEvent e) {
Point p = e.getPoint();
lat = map.getPosition(p).getLat();
lon = map.getPosition(p).getLon();
}
//Where to locate the method ????
protected void paintComponent(Graphics g){
Coordinate c1= new Coordinate(lat,lon),c2= new Coordinate(lat+10,lon+10); //Draw the line
List<Coordinate> route = new ArrayList<Coordinate>(Arrays.asList(c1, c2, c1));
map.addMapPolygon(new MapPolygonImpl(route));
}
};
p.add(map);
p.setVisible(true);
}
public JPanel getJPanel() {return p;}
}
要避免鼠标侦听器的双重调用,请参见问题
JMapViewer, MouseListener called 2 times
该类不是直接从JMapViewer派生的。使用鼠标点击,我得到了两个坐标[lat,lon],将用于绘制由P1,P2给出的线,其中P1=[lat,lon],P2=[lat+10,lon+10]
我不确定方法paintComponent()应该放在哪里,以便能够向OSM映射添加一些图形
public class TEST
{
public static void main (String [] args)
{
JFrame jf = new JFrame();
jf.setSize(800, 600);
Map3 p = new Map3();
jf.add(p.getJPanel());
jf.setVisible(true);
}
}
当前版本工作不正常,未调用paintComponent()
谢谢你的帮助
# 1 楼答案
已找到以下解决方案:
主要的想法是取代
用下面的结构
在这种情况下,Map3可能来自JMapViewer。希望有帮助:-)
# 2 楼答案
您正在将“地图”添加到面板中。因此,您需要重写
JMapViewwer
类的paintComponent()
方法无论何时重写类的方法,都应使用:
如果不正确地重写了一个方法,就会出现编译错误
但是,在您的情况下,甚至不应该重写paintComponent()方法。这种方法只适用于绘画。它不用于添加新的多边形对象。也许代码应该在mousePressed()逻辑中