简体   繁体   中英

Moving map markers with OpenStreetMaps JMapViewer

I am creating a map using JMapViewer in Swing. I have several MapMarkerDots on the map which represent cars. I'm trying to update the positions of these markers so that they appear to be driving around the map however it's not quite working properly. I have a list of coordinates that the "car" is to follow but what happens is that the positions are updated but the markers are not redrawn until this is finished meaning that the marker is drawn at the initial location and at the final location rather that at every point between the two. The code I'm using for this is below. Any idea as to why this may be happening?

public void drawRoute(String id){

    MapMarkerDot mmd;                                                       
    String evMarkerObject;          // ID and Marker position
    String[] items, locations;
    double lat, lon;

    for(int i = 0; i < route.length-1; i+=2){       // Iterate through the route

         List markers = zmap.getMapMarkerList();        // Get the markers that are currently on the map


        for(int j = 0; j < Daemon.evMarkers.size(); j++){  // Go through the list of recorded marker IDs and locations
            evMarkerObject = Arrays.toString(Daemon.evMarkers.get(j));      // Get marker id and location
            items = evMarkerObject.split(", ");                             // Split the ID and location
            if(items[0].substring(1).equals(id)){                           // If an ID match is found

                locations = items[1].split(" ");                            // Split location values by " "
                lat = Double.parseDouble(locations[2]);                     // Get latitude of marker
                lon = Double.parseDouble(locations[3]);                     // Get longitude of marker
                for(int k = 0; k < markers.size(); k++){                    // Go through list of markers currently on map
                    mmd = (MapMarkerDot) markers.get(k);                    // Get each marker in turn
                    if((mmd.getLat() == lat) && (mmd.getLon() == lon)){     // Check if recorded position matches marker position                               
                        zmap.removeMapMarker(mmd);                          // Remove marker from the map
                        break;                                              // Break from loop (appropriate marker found)
                    }
                }

                Daemon.evMarkers.remove(j);                                                 // Remove record of marker ID and position
                zaddMarker(Color.BLUE, route[i], route[i+1], 'e', items[0].substring(1));   // Add marker at new position
                    //zmap.repaint();
            }
        }
    }

Calling the function (based on answer from @Catalina):

SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>(){

                                @Override
                                protected Void doInBackground() throws Exception {
                                    drawRoute(markerID);
                                    return null;
                                }
                            };

                            worker.execute();

This is called on a mouse click event.

Daemon sounds like a background thread, so you need to do any updates on the event dispatch thread (EDT) with SwingUtilities.invokeLater . If that works, SwingWorker might be a good way to make your Daemon do regular EDT updates in the worker's process method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM