0

Swing で JMapViewer を使用してマップを作成しています。車を表すマップ上にいくつかの MapMarkerDots があります。これらのマーカーの位置を更新して、マップ上を移動しているように見せようとしていますが、うまく機能していません。「車」が従うべき座標のリストがありますが、何が起こるかは、位置が更新されますが、これが終了するまでマーカーは再描画されません。つまり、マーカーは最初の場所と最終的な場所ではなく、 2つの間のすべてのポイントで。これに使用しているコードは以下のとおりです。なぜこれが起こっているのかについて何か考えはありますか?

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

関数の呼び出し (@Catalina からの回答に基づく):

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

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

                            worker.execute();

これは、マウス クリック イベントで呼び出されます。

4

1 に答える 1

2

Daemonバックグラウンドスレッドのように聞こえるので、イベントディスパッチスレッド(EDT)で更新を行う必要がありますSwingUtilities.invokeLater。それが機能する場合は、ワーカーのメソッドで定期的にEDTを更新するSwingWorkerための良い方法かもしれません。Daemonprocess

于 2013-03-01T12:39:46.987 に答える