2016-08-14 46 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