2016-08-14 5 views
2

JMapViewerにマーカーとして2つのカスタム画像があります。私はマップが適切なパンとズームを設定して、2つのマーカーがマップディスプレイに表示されるようにしたいと思います。私はそれを行うボタンを持っています。だから、起こっているのは、ロード中に地図がこれらのマーカーにズームされていないということです。しかし、私がボタンをクリックすると、それは行います。ローディング時に適切なパンとズームを設定する方法はありますか?JMapViewer:地図がロードされたときにパンとズームが設定されない

public class PanelAcars extends javax.swing.JPanel implements JMapViewerEventListener 
{ 
    private final JMapViewerTree treeMap; 

    public PanelAcars() 
    { 
     super(); 
     initComponents(); // GUI components 

     treeMap = new JMapViewerTree("Zones"); 

     // Listen to the map viewer for user operations so components will 
     // receive events and update 
     map().addJMVListener(this); 

     setLayout(new BorderLayout()); 

     pnlAcarsMapView = new JPanel(new BorderLayout()); 
     JPanel panelTop = new JPanel(); 
     JPanel panelBottom = new JPanel(); 
     JPanel helpPanel = new JPanel(); 

     add(pnlAcarsMapView, BorderLayout.NORTH); 
     add(helpPanel, BorderLayout.SOUTH); 
     pnlAcarsMapView.add(panelTop, BorderLayout.NORTH); 
     pnlAcarsMapView.add(panelBottom, BorderLayout.SOUTH); 

     /* THIS BUTTON WORKS!!! */ 
     JButton button = new JButton("Zoom..."); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       map().setDisplayToFitMapMarkers(); 
      } 
     }); 


     final JCheckBox showZoomControls = new JCheckBox("Show zoom controls"); 
     showZoomControls.setSelected(map().getZoomControlsVisible()); 
     showZoomControls.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       map().setZoomContolsVisible(showZoomControls.isSelected()); 
      } 
     }); 
     panelBottom.add(showZoomControls); 
     final JCheckBox scrollWrapEnabled = new JCheckBox("Scrollwrap enabled"); 
     scrollWrapEnabled.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       map().setScrollWrapEnabled(scrollWrapEnabled.isSelected()); 
      } 
     }); 
     panelBottom.add(scrollWrapEnabled); 
     panelBottom.add(button); 

     add(treeMap, BorderLayout.CENTER); 

     /* Add Airports to the map */ 
     LayerGroup mapGroupAirports = new LayerGroup("MapAirports"); 
     Layer mapLayerDep = mapGroupAirports.addLayer("MapDep"); 
     Layer mapLayerDest = mapGroupAirports.addLayer("MapDest"); 
     Layer mapLayerAlt = mapGroupAirports.addLayer("MapAlt"); 


     /* Add Plane to the map */ 
     Layer mapLayerPlane = new Layer("MapPlane"); 

     /* Set coordinates */ 
     Coordinate coordinatesPlane = new Coordinate(49.814284999, 98.642065999); 
     Coordinate coordinatesDep = new Coordinate(23.814284999, 45.642065999); 

     JMapViewerMarkerCustomImage markerPlane; 
     JMapViewerMarkerCustomImage markerDep; 

     Image imageMarkerPlane; 
     Image imageMarkerDep; 

     try 
     { 
      imageMarkerPlane = ImageIO.read(this.getClass().getResource("/images/image1.png")); 
      markerPlane = new JMapViewerMarkerCustomImage(coordinatesPlane,imageMarkerPlane); 
      map().addMapMarker(markerPlane); 

      imageMarkerDep = ImageIO.read(this.getClass().getResource("/images/image2.png")); 
      markerDep = new JMapViewerMarkerCustomImage(coordinatesDep,imageMarkerDep); 
      map().addMapMarker(markerDep); 

      // AND THIS IS NOT WORKING AT LOADING!!! 
      map().setDisplayToFitMapElements(true, true, true); 

     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 


     map().addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if (e.getButton() == MouseEvent.BUTTON1) { 
        map().getAttribution().handleAttribution(e.getPoint(), true); 
       } 
      } 
     }); 

     map().addMouseMotionListener(new MouseAdapter() { 
      @Override 
      public void mouseMoved(MouseEvent e) { 
       Point p = e.getPoint(); 
       boolean cursorHand = map().getAttribution().handleAttributionCursor(p); 
       if (cursorHand) { 
        map().setCursor(new Cursor(Cursor.HAND_CURSOR)); 
       } else { 
        map().setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
       } 
       //if (showToolTip.isSelected()) map().setToolTipText(map().getPosition(p).toString()); 
      } 
     }); 

    } 

ありがとうございます!

答えて

2

マップの実装tileLoadingFinished()setDisplayToFitMapMarkers()を呼び出します。 boolean変数loaded(デフォルトではfalse)を使用すると、以下の実装では最初のタイルがロードされた後にメソッドが呼び出されます。親の実装では、その後のタイルはrepaint()になります。

private boolean loaded; 

private class MyViewer extends JMapViewer { 

    @Override 
    public void tileLoadingFinished(Tile tile, boolean success) { 
     super.tileLoadingFinished(tile, success); 
     if (!loaded & success) { 
      loaded = true; 
      setDisplayToFitMapMarkers(); 
     } 
    } 
    … 
} 

JMapViewerTreeを使用して同様の結果を得るために、あなたはJMapViewerTreeコンストラクタでインスタンス化されmapを変更する必要があります。以下の変更は、Demo.javaで動作:代わりMouseAdapterの余談として

… 
private boolean loaded; 
… 
public JMapViewerTree(String name, boolean treeVisible) { 
    … 
    map = new JMapViewer() { 
     @Override 
     public void tileLoadingFinished(Tile tile, boolean success) { 
      super.tileLoadingFinished(tile, success); 
      if (!loaded & success) { 
       loaded = true; 
       setDisplayToFitMapMarkers(); 
      } 
     } 
    }; 
    … 
} 

hereが示唆されているように、DefaultMapControllerを拡張または交換を検討してください。

+0

trashgod。どうもありがとう!それは今働く。あなたの2番目のコメントに関して、私はちょっと混乱しました。あなたが提案した '' JMapViewer''の代わりに 'DefaultMapController'を拡張しようとしました。その結果、 'super()'、 'setLayout'、' add() 'などが見つからないため、コードが壊れてしまいます。このメソッドがなければ、' new DefaultMapController(map) 'メソッドでmapは見つかりません。ありがとうございました! –

+0

ゴミ箱。もう一回質問してもよろしいですか? 'tileLoadingFinished()'を実装するために、Panelの代わりにJMapViewerにクラスを拡張しなければなりませんでした。その結果、地図上に** 2つの**ズームコントロールが表示されます。もう1つはズームコントロールの後ろに表示されます。 2番目のズームコントローラーに 'add(treeMap、BorderLayout.CENTER)'が追加されているようです。ただし、この行を削除すると、私のカスタムマーカーが見えなくなります。 'tileLoadingFinished()'を保持する2番目のズームコントロールをどのように削除できるか知っていますか?どうもありがとう! –

+1

'JMapViewerTree'に' TileLoaderListener'を実装させ、 'getViewer()'によって返される 'JMapViewer'に対して' setDisplayToFitMapMarkers() 'を呼び出すように見えます。 – trashgod

関連する問題