2016-04-22 9 views
0

私はちょっとした問題を抱えています。私はいくつかのオブジェクトを一度に追跡するためのGPS追跡アプリケーションを作成しています。データはシリアルインタフェース経由で送られますが、これは私が理解できるものからうまく来ています。問題は、マップが作成され表示されているJPanelを継続的に更新する必要があることです。JPanelを継続的に更新するにはどうすればよいですか?

public JPanel mapDisplay(){ 
    JPanel mapPanel = new JPanel(); 
    mapPanel.setSize(560, 540); 
    Coordinate start = new Coordinate (-34.9286, 138.6); 
    trackMap.addMapMarker(new MapMarkerDot(1Lat, 1Lon)); 
    trackMap.setDisplayPosition(start,8); 
    System.out.println(1Lat); 

    mapPanel.add(trackMap); 
    mapPanel.setVisible(true); 
    return mapPanel; 
} 

これは私が持っているものであり、一度ポイントを表示して幸せですが、更新されません。シリアルメソッドで1Lat変数を出力すると、それは連続して印刷されますが、ここでは1回だけ行います。

私が見つけた答えの多くは、配列によってマーカーを設定することを参照していますが、追跡しているオブジェクトがどこにでもあり得るため、この場合は機能しません。

任意の助けいただければ幸いです:)

+3

[Concurrency in Java](http://docs.oracle.com/javase/tutorial/essential/concurrency/)から問題を理解してから、[Swing Timersの使い方](http ://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)と[Worker Threads and SwingWorker](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)を参照してください。 )可能な解決策については – MadProgrammer

+0

Worker Threadを使用でき、ArrayListを使用することはできますか?もしそうすれば、私はデータが失われるリスクを冒すでしょう。 –

答えて

1

それはワーカースレッドを使用してArrayListを使用しないことは可能ですか?もしそうすれば、私はデータが失われるリスクを冒すでしょう。

必ずしもそうである必要はありません。 SwingWorkerでは、doInBackground()メソッドの実装はpublish()になります。特に、「publish()の複数の呼び出しの結果は、たびたびprocess()の呼び出しで蓄積されることに注意してください。 process()では、List<Coordinate>をループし、routerepaint()mapに更新してください。

map

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.SwingWorker; 
import org.openstreetmap.gui.jmapviewer.Coordinate; 
import org.openstreetmap.gui.jmapviewer.JMapViewer; 
import org.openstreetmap.gui.jmapviewer.MapPolygonImpl; 

/** 
* @see http://stackoverflow.com/a/37193636/230513 
*/ 
public class MapWorkerTest { 

    private final List<Coordinate> route = new ArrayList<>(); 

    private void display() { 
     JFrame f = new JFrame("MapWorker"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JMapViewer map = new JMapViewer() { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(640, 480); 
      } 

      @Override 
      public String getToolTipText(MouseEvent e) { 
       Coordinate c = (Coordinate) getPosition(e.getX(), e.getY()); 
       return c.getLat() + " " + c.getLon(); 
      } 
     }; 
     map.setToolTipText(""); 
     Coordinate start = new Coordinate(-34.9286, 138.6); 
     route.add(start); 
     MapPolygonImpl poly = new MapPolygonImpl(route); 
     poly.setColor(Color.blue); 
     map.addMapPolygon(poly); 
     map.setDisplayPosition(start, 10); 
     f.add(map); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     new MapWorker(map, start).execute(); 
    } 

    private class MapWorker extends SwingWorker<Void, Coordinate> { 

     private final JMapViewer map; 
     private Coordinate last; 

     public MapWorker(JMapViewer map, Coordinate start) { 
      this.map = map; 
      this.last = start; 
     } 

     @Override 
     protected Void doInBackground() throws Exception { 
      while (!isCancelled()) { 
       last = new Coordinate(last.getLat() + 0.0025, last.getLon() + 0.01); 
       publish(last); 
       Thread.sleep(1000); 
      } 
      return null; 
     } 

     @Override 
     protected void process(List<Coordinate> chunks) { 
      for (Coordinate c : chunks) { 
       route.add(c); 
      } 
      map.repaint(); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new MapWorkerTest()::display); 
    } 
} 

複数のルートの管理が課題として残され。

+0

お返事ありがとうございます、私はそれが私がそれを望んでいた方法に行くことができました。 私のコードの周りのセクションを動かすことで、私はマップを表示して、マップの別のレイヤーとして別のメソッドからマップポイントを追加することができました。 マップポイントを削除し、緯度と経度が変更されたときに再追加します。すべてが最終的にうまくいったので、私は継続的に質問を更新するのはjpanelではないと思います。ちょうどJMapViewerのものです。] –

+0

イベントディスパッチスレッドをブロックしないでください。左の[空のチェックマーク](http://meta.stackoverflow.com/a/5235/163188)をクリックするか、[あなた自身の質問に答える](http:// meta .stackoverflow.com/q/17463/163188)。 – trashgod

関連する問題