2016-08-14 29 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),下面的實現在第一個tile加載後調用方法;父執行將會在任何後續的圖塊中執行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,考慮延長或更換DefaultMapController,作爲建議here

+0

垃圾。非常感謝!它現在有效。關於你的第二個評論,我有點困惑。正如你所建議的,我試圖擴展DefaultMapController而不是擴展JMapViewer。因此,代碼被破壞,因爲現在找不到'super()','setLayout','add()'等等。沒有它,在'new DefaultMapController(map)'方法中,找不到map。謝謝! –

+0

垃圾。我可以再問一個問題嗎?要實現'tileLoadingFinished()',我必須將類擴展爲JMapViewer而不是Panel。因此,現在我在地圖上看到**兩個**縮放控件,一個在另一個後面。看起來第二個縮放控制器添加了這個:'add(treeMap,BorderLayout.CENTER)'。但是,如果我刪除此行,我的自定義標記不再可見。你知道我可以如何移除保留'tileLoadingFinished()'的第二個縮放控件嗎?非常感謝! –

+1

看起來你可以讓'JMapViewerTree'實現'TileLoaderListener'並且在'getViewer()'返回的'JMapViewer'上調用'setDisplayToFitMapMarkers()'。 – trashgod

相關問題