2016-08-14 8 views
2

JMapViewer에 마커로 두 개의 맞춤 이미지가 있습니다. 두 개의 마커가지도 디스플레이에 표시되도록지도에서 적절한 팬 및 줌을 설정하고 싶습니다. 나는 그것을하는 버튼을 가지고있다. 따라서,로드 중일 때 맵이이 마커로 확대되지 않습니다. 하지만 버튼을 클릭하면됩니다. 적절한 팬을 설정하고로드시 확대/축소하는 방법이 있습니까?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 작동 :

… 
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(); 
      } 
     } 
    }; 
    … 
} 
제쳐두고로서

대신 MouseAdapter, here 제안 같이 연장 DefaultMapController 또는 교체를 고려한다.

+0

쓰레기통. 고마워요! 이제 작동합니다. 두 번째 코멘트에 관해서, 나는 약간 혼란스러워했다. 나는 당신이 제안한대로''extends JMapViewer ''대신'DefaultMapController'를 확장하려고했습니다. 결과적으로'super()','setLayout','add()'등을 찾을 수 없으므로 코드가 깨지게됩니다.이 메소드가 없으면'new DefaultMapController (map)'메소드에서 map을 찾을 수 없습니다. 고맙습니다! –

+0

쓰레기통. 질문 하나 더 드릴까요? 'tileLoadingFinished()'를 구현하기 위해, 클래스를 Panel 대신 JMapViewer로 확장해야했습니다. 결과적으로 이제지도에서 ** 두 개의 ** 확대/축소 컨트롤을 볼 수 있습니다. 하나는 다른 하나 뒤에 있습니다. 두 번째 줌 컨트롤러가 다음과 같이 추가 된 것처럼 보입니다 :'add (treeMap, BorderLayout.CENTER)'. 그러나이 행을 삭제하면 내 맞춤 마커가 더 이상 보이지 않습니다. 'tileLoadingFinished()'를 유지하는 두 번째 줌 컨트롤을 어떻게 제거 할 수 있는지 알고 계십니까? 고마워요! –

+1

'JMapViewerTree'가'TileLoaderListener'를 구현하고'getViewer()'가 반환 한'JMapViewer'에서'setDisplayToFitMapMarkers()'를 호출 할 수있는 것처럼 보입니다. – trashgod