有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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()

谢谢你的帮助


共 (2) 个答案

  1. # 1 楼答案

    已找到以下解决方案:

    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    import javax.swing.JFrame;
    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 extends JMapViewer{
    private double lat, lon;
    
    public Map3() 
    {
       new DefaultMapController(this) {
            public void mouseClicked(MouseEvent e) {
                System.out.println(e.getPoint());
                Point  p = e.getPoint();
                lat = map.getPosition(p).getLat();
                lon = map.getPosition(p).getLon();
            }};
      }
    
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        Coordinate c1= new Coordinate(lat,lon),c2= new Coordinate(lat+10,lon+10);
        List<Coordinate> route = new ArrayList<Coordinate>(Arrays.asList(c1, c2, c1));
        this.addMapPolygon(new MapPolygonImpl(route));
    }   
    
    public static void main (String [] args){
                JFrame jf = new JFrame();
                jf.setSize(800, 600);
                Map3 m= new Map3();
                jf.add(m);
                jf.setVisible(true);
        }
    }
    

    主要的想法是取代

     addMouseListener(new DefaultMapController(this) {
            public void mouseClicked(MouseEvent e){
                System.out.println(e.getPoint());
                Point  p = e.getPoint();
                lat = map.getPosition(p).getLat();
                lon = map.getPosition(p).getLon();
            });
    

    用下面的结构

    new DefaultMapController(this) {
            public void mouseClicked(MouseEvent e) {
                System.out.println(e.getPoint());
                Point  p = e.getPoint();
                lat = map.getPosition(p).getLat();
                lon = map.getPosition(p).getLon();
            }};
    

    在这种情况下,Map3可能来自JMapViewer。希望有帮助:-)

  2. # 2 楼答案

    p.add(map);
    

    您正在将“地图”添加到面板中。因此,您需要重写JMapViewwer类的paintComponent()方法

    无论何时重写类的方法,都应使用:

    @Override
    protected void paintComponent(Graphics g)
    ...
    

    如果不正确地重写了一个方法,就会出现编译错误

    但是,在您的情况下,甚至不应该重写paintComponent()方法。这种方法只适用于绘画。它不用于添加新的多边形对象。也许代码应该在mousePressed()逻辑中