<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Best practice to reset a map in Java Maps SDK Questions</title>
    <link>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680847#M2068</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Reset a map is a basic functionnality in most applications.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In my case, I needed it because end-user will have possibilities to change the map context and content without exiting the application. But removing all layers before adding a new one is not enough as spatial reference can change, or tiling scheme and extent can vary from on layer to another (switch from one Tiled Package to another one).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So I've implemented a "reset map" sample application (disconnected scenario), but I'm not sure it's best practice so I hope to have some comments on it to improve it if necessary (is dispose() correctly used ?)...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;and more importantly: &lt;/SPAN&gt;&lt;STRONG&gt;I'm not satisfied because I have to create new JMap component each time I reset the map&lt;/STRONG&gt;&lt;SPAN&gt;... it's the only way I found to reset the spatial reference and map extent properties (like min/max scale).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So&lt;/SPAN&gt;&lt;STRONG&gt; is it possible to properly reset a map, with the same JMap object (without new instanciation) ?&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Sample code (tpk used are from arcgis samples):&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;public class ResetMapApplication {
 
 /**
&amp;nbsp; * Layer initialize complete listener
&amp;nbsp; */
 public class LayerListener implements LayerInitializeCompleteListener {
&amp;nbsp; @Override
&amp;nbsp; public void layerInitializeComplete(LayerInitializeCompleteEvent e) {
&amp;nbsp;&amp;nbsp; Layer layer = e.getLayer(); 
&amp;nbsp;&amp;nbsp; if (layer.getStatus() == LayerStatus.INITIALIZED) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(String.format("-LayerInitializeCompleteEvent- Layer '%s' is initialized on map '%s' !", layer.getName(), map.getName()));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(String.format("-LayerInitializeCompleteEvent- ERROR: Layer '%s' is NOT initialized on map '%s' !", layer.getName(), map.getName()));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("&amp;nbsp;&amp;nbsp;&amp;nbsp; initialization error: " + e.getLayer().getInitializationError());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }
 }
 
 /**
&amp;nbsp; * Map event listener
&amp;nbsp; */
 public class MapListener implements MapEventListener {
&amp;nbsp; @Override
&amp;nbsp; public void mapDispose(MapEvent event) {
&amp;nbsp;&amp;nbsp; System.out.println(String.format("-MapEventListener- Map '%s' is disposed !", map.getName()));
&amp;nbsp; }

&amp;nbsp; @Override
&amp;nbsp; public void mapReady(final MapEvent event) {
&amp;nbsp;&amp;nbsp; SwingUtilities.invokeLater(new Runnable() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(String.format("-MapEventListener- Map '%s' is ready !", map.getName()));
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; });
&amp;nbsp; }

&amp;nbsp; @Override
&amp;nbsp; public void mapExtentChanged(MapEvent event) {
&amp;nbsp;&amp;nbsp; // do nothing
&amp;nbsp; }
 }
 
 /**
&amp;nbsp; * Main : application's entry
&amp;nbsp; * @param args
&amp;nbsp; */
 public static void main(String[] args) {
&amp;nbsp; SwingUtilities.invokeLater(new Runnable() {
&amp;nbsp;&amp;nbsp; public void run() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // instance of this application
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResetMapApplication layerApp = new ResetMapApplication();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // create the UI, including the map, for the application.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JFrame appWindow = layerApp.createWindow();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; appWindow.add(layerApp.createUI());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; appWindow.setVisible(true);
&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // on any error, display the stack trace.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; });
 }
 
 // content pane
 private JLayeredPane contentPane;
 
 // map
 private JMap map;
 
 // map count
 private int count = 1;
 
 // base layer TILED PACKAGE 1
 private static final String TPK_BASEMAP_1 = "C:\\temp\\Topographic.tpk";
 
 // base layer TILED PACKAGE 2
 private static final String TPK_BASEMAP_2 = "C:\\temp\\SanFrancisco.tpk";
 
 /**
&amp;nbsp; * Creates a window.
&amp;nbsp; * @return a window.
&amp;nbsp; */
 private JFrame createWindow() {
&amp;nbsp; JFrame window = new JFrame("Test - Reset a Map");
&amp;nbsp; window.setBounds(100, 100, 1000, 700);
&amp;nbsp; window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
&amp;nbsp; window.getContentPane().setLayout(new BorderLayout(0, 0));
&amp;nbsp; 
&amp;nbsp; window.addWindowListener(new WindowAdapter() {
&amp;nbsp;&amp;nbsp; @Override
&amp;nbsp;&amp;nbsp; public void windowClosing(WindowEvent windowEvent) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; super.windowClosing(windowEvent);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (map != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; map.dispose();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; });
&amp;nbsp; 
&amp;nbsp; return window;
 }

 /**
&amp;nbsp; * Creates application content with ToolBar and Map's container
&amp;nbsp; * @return
&amp;nbsp; */
 private JComponent createUI() {
&amp;nbsp; // application content
&amp;nbsp; JPanel applicationPanel = new JPanel();
&amp;nbsp; applicationPanel.setLayout(new BorderLayout(0, 0));
&amp;nbsp; 
&amp;nbsp; // button toolbar
&amp;nbsp; final JToolBar toolBar = this.createToolBar();
&amp;nbsp; 
&amp;nbsp; // panel for the map : map will be created later...
&amp;nbsp; this.contentPane = this.createContentPane();
&amp;nbsp; 
&amp;nbsp; applicationPanel.add(toolBar, BorderLayout.NORTH);
&amp;nbsp; applicationPanel.add(this.contentPane, BorderLayout.CENTER);
&amp;nbsp; 
&amp;nbsp; return applicationPanel;
 }
 
 /**
&amp;nbsp; * Create a toolbar with buttons
&amp;nbsp; * @return toolBar - the toolBar
&amp;nbsp; */
 private JToolBar createToolBar() {
&amp;nbsp; JToolBar toolBar = new JToolBar();
&amp;nbsp; toolBar.setLayout(new FlowLayout(FlowLayout.CENTER));
&amp;nbsp; 
&amp;nbsp; // button add TPK 1
&amp;nbsp; JButton buttonTPK1 = new JButton("Add TPK Topographic");
&amp;nbsp; buttonTPK1.addActionListener(new ActionListener() {
&amp;nbsp;&amp;nbsp; public void actionPerformed(ActionEvent e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; // reset the map
&amp;nbsp;&amp;nbsp;&amp;nbsp; resetMap();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; // add tiled layer
&amp;nbsp;&amp;nbsp;&amp;nbsp; ArcGISLocalTiledLayer tiledLayer = new ArcGISLocalTiledLayer(TPK_BASEMAP_1);
&amp;nbsp;&amp;nbsp;&amp;nbsp; tiledLayer.setName(TPK_BASEMAP_1);
&amp;nbsp;&amp;nbsp;&amp;nbsp; tiledLayer.addLayerInitializeCompleteListener(new LayerListener());
&amp;nbsp;&amp;nbsp;&amp;nbsp; map.getLayers().add(tiledLayer);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; });
&amp;nbsp; toolBar.add(buttonTPK1);
&amp;nbsp; 
&amp;nbsp; // button Add TPK 2
&amp;nbsp; JButton buttonTPK2 = new JButton("Add TPK SanFrancisco");
&amp;nbsp; buttonTPK2.addActionListener(new ActionListener() {
&amp;nbsp;&amp;nbsp; public void actionPerformed(ActionEvent e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; // reset the map
&amp;nbsp;&amp;nbsp;&amp;nbsp; resetMap();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; // add tiled layer
&amp;nbsp;&amp;nbsp;&amp;nbsp; ArcGISLocalTiledLayer tiledLayer = new ArcGISLocalTiledLayer(TPK_BASEMAP_2);
&amp;nbsp;&amp;nbsp;&amp;nbsp; tiledLayer.setName(TPK_BASEMAP_2);
&amp;nbsp;&amp;nbsp;&amp;nbsp; tiledLayer.addLayerInitializeCompleteListener(new LayerListener());
&amp;nbsp;&amp;nbsp;&amp;nbsp; map.getLayers().add(tiledLayer);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; });
&amp;nbsp; toolBar.add(buttonTPK2);
&amp;nbsp; 
&amp;nbsp; return toolBar;
 }
 
 /**
&amp;nbsp; * Creates a content pane.
&amp;nbsp; * @return a content pane.
&amp;nbsp; */
 private JLayeredPane createContentPane() {
&amp;nbsp; JLayeredPane contentPane = new JLayeredPane();
&amp;nbsp; contentPane.setLayout(new BorderLayout(0, 0));
&amp;nbsp; contentPane.setVisible(true);
&amp;nbsp; return contentPane;
 }

 /**
&amp;nbsp; * Reset the map :
&amp;nbsp; *&amp;nbsp; - remove and dispose resources 
&amp;nbsp; *&amp;nbsp; - create new map 
&amp;nbsp; *&amp;nbsp; - remove and add on panel (container)
&amp;nbsp; */
 private void resetMap() {
&amp;nbsp; System.out.println("-actionPerformed - RESET MAP !");
&amp;nbsp; 
&amp;nbsp; if (map != null) {
&amp;nbsp;&amp;nbsp; // remove all layers
&amp;nbsp;&amp;nbsp; for (int i = (this.map.getLayers().size() - 1) ; i == 0 ; i--) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; this.map.getLayers().remove(i);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; // dispose data ressources
&amp;nbsp;&amp;nbsp; this.map.dispose(); 
&amp;nbsp;&amp;nbsp; // &lt;STRONG&gt;=&amp;gt;&amp;gt; ISSUE HERE : dispose() seems to be fired on the new map after createMap() below&amp;nbsp; (see Console prints)&lt;/STRONG&gt;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; // remove map from content pane
&amp;nbsp;&amp;nbsp; this.contentPane.remove(map);
&amp;nbsp; }
&amp;nbsp; 
&amp;nbsp; // re-create the map
&amp;nbsp; this.map = createMap();
&amp;nbsp; // &lt;STRONG&gt;=&amp;gt;&amp;gt; ISSUE HERE : can I avoid a new JMap to re-initialize the map (no spatial ref, no fullextent, etc.) ??&lt;/STRONG&gt; 
&amp;nbsp; 
&amp;nbsp; // add new map to the content pane
&amp;nbsp; this.contentPane.add(map);
&amp;nbsp; 
&amp;nbsp; // Revalidate the map to perform a hierarchical refresh of all components
&amp;nbsp; this.map.revalidate();
 }
 
 /**
&amp;nbsp; * Create a map with navigator overlay
&amp;nbsp; * @return JMap - the map
&amp;nbsp; */
 private JMap createMap() {
&amp;nbsp; JMap jMap = new JMap();
&amp;nbsp; 
&amp;nbsp; // give an incremental name
&amp;nbsp; jMap.setName("map " + count ++);
&amp;nbsp; 
&amp;nbsp; // Add map event listner
&amp;nbsp; jMap.addMapEventListener(new MapListener());
&amp;nbsp; 
&amp;nbsp; // Add NavigatorOverlay
&amp;nbsp; NavigatorOverlay navigator = new NavigatorOverlay();
&amp;nbsp; jMap.addMapOverlay(navigator);
&amp;nbsp; 
&amp;nbsp; return jMap;
 }
}&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;source code also available in zip file&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sun, 12 Dec 2021 16:47:04 GMT</pubDate>
    <dc:creator>JeremieJoalland1</dc:creator>
    <dc:date>2021-12-12T16:47:04Z</dc:date>
    <item>
      <title>Best practice to reset a map</title>
      <link>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680847#M2068</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Reset a map is a basic functionnality in most applications.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In my case, I needed it because end-user will have possibilities to change the map context and content without exiting the application. But removing all layers before adding a new one is not enough as spatial reference can change, or tiling scheme and extent can vary from on layer to another (switch from one Tiled Package to another one).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So I've implemented a "reset map" sample application (disconnected scenario), but I'm not sure it's best practice so I hope to have some comments on it to improve it if necessary (is dispose() correctly used ?)...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;and more importantly: &lt;/SPAN&gt;&lt;STRONG&gt;I'm not satisfied because I have to create new JMap component each time I reset the map&lt;/STRONG&gt;&lt;SPAN&gt;... it's the only way I found to reset the spatial reference and map extent properties (like min/max scale).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So&lt;/SPAN&gt;&lt;STRONG&gt; is it possible to properly reset a map, with the same JMap object (without new instanciation) ?&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Sample code (tpk used are from arcgis samples):&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;public class ResetMapApplication {
 
 /**
&amp;nbsp; * Layer initialize complete listener
&amp;nbsp; */
 public class LayerListener implements LayerInitializeCompleteListener {
&amp;nbsp; @Override
&amp;nbsp; public void layerInitializeComplete(LayerInitializeCompleteEvent e) {
&amp;nbsp;&amp;nbsp; Layer layer = e.getLayer(); 
&amp;nbsp;&amp;nbsp; if (layer.getStatus() == LayerStatus.INITIALIZED) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(String.format("-LayerInitializeCompleteEvent- Layer '%s' is initialized on map '%s' !", layer.getName(), map.getName()));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(String.format("-LayerInitializeCompleteEvent- ERROR: Layer '%s' is NOT initialized on map '%s' !", layer.getName(), map.getName()));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("&amp;nbsp;&amp;nbsp;&amp;nbsp; initialization error: " + e.getLayer().getInitializationError());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }
 }
 
 /**
&amp;nbsp; * Map event listener
&amp;nbsp; */
 public class MapListener implements MapEventListener {
&amp;nbsp; @Override
&amp;nbsp; public void mapDispose(MapEvent event) {
&amp;nbsp;&amp;nbsp; System.out.println(String.format("-MapEventListener- Map '%s' is disposed !", map.getName()));
&amp;nbsp; }

&amp;nbsp; @Override
&amp;nbsp; public void mapReady(final MapEvent event) {
&amp;nbsp;&amp;nbsp; SwingUtilities.invokeLater(new Runnable() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(String.format("-MapEventListener- Map '%s' is ready !", map.getName()));
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; });
&amp;nbsp; }

&amp;nbsp; @Override
&amp;nbsp; public void mapExtentChanged(MapEvent event) {
&amp;nbsp;&amp;nbsp; // do nothing
&amp;nbsp; }
 }
 
 /**
&amp;nbsp; * Main : application's entry
&amp;nbsp; * @param args
&amp;nbsp; */
 public static void main(String[] args) {
&amp;nbsp; SwingUtilities.invokeLater(new Runnable() {
&amp;nbsp;&amp;nbsp; public void run() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // instance of this application
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResetMapApplication layerApp = new ResetMapApplication();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // create the UI, including the map, for the application.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JFrame appWindow = layerApp.createWindow();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; appWindow.add(layerApp.createUI());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; appWindow.setVisible(true);
&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // on any error, display the stack trace.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; });
 }
 
 // content pane
 private JLayeredPane contentPane;
 
 // map
 private JMap map;
 
 // map count
 private int count = 1;
 
 // base layer TILED PACKAGE 1
 private static final String TPK_BASEMAP_1 = "C:\\temp\\Topographic.tpk";
 
 // base layer TILED PACKAGE 2
 private static final String TPK_BASEMAP_2 = "C:\\temp\\SanFrancisco.tpk";
 
 /**
&amp;nbsp; * Creates a window.
&amp;nbsp; * @return a window.
&amp;nbsp; */
 private JFrame createWindow() {
&amp;nbsp; JFrame window = new JFrame("Test - Reset a Map");
&amp;nbsp; window.setBounds(100, 100, 1000, 700);
&amp;nbsp; window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
&amp;nbsp; window.getContentPane().setLayout(new BorderLayout(0, 0));
&amp;nbsp; 
&amp;nbsp; window.addWindowListener(new WindowAdapter() {
&amp;nbsp;&amp;nbsp; @Override
&amp;nbsp;&amp;nbsp; public void windowClosing(WindowEvent windowEvent) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; super.windowClosing(windowEvent);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (map != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; map.dispose();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; });
&amp;nbsp; 
&amp;nbsp; return window;
 }

 /**
&amp;nbsp; * Creates application content with ToolBar and Map's container
&amp;nbsp; * @return
&amp;nbsp; */
 private JComponent createUI() {
&amp;nbsp; // application content
&amp;nbsp; JPanel applicationPanel = new JPanel();
&amp;nbsp; applicationPanel.setLayout(new BorderLayout(0, 0));
&amp;nbsp; 
&amp;nbsp; // button toolbar
&amp;nbsp; final JToolBar toolBar = this.createToolBar();
&amp;nbsp; 
&amp;nbsp; // panel for the map : map will be created later...
&amp;nbsp; this.contentPane = this.createContentPane();
&amp;nbsp; 
&amp;nbsp; applicationPanel.add(toolBar, BorderLayout.NORTH);
&amp;nbsp; applicationPanel.add(this.contentPane, BorderLayout.CENTER);
&amp;nbsp; 
&amp;nbsp; return applicationPanel;
 }
 
 /**
&amp;nbsp; * Create a toolbar with buttons
&amp;nbsp; * @return toolBar - the toolBar
&amp;nbsp; */
 private JToolBar createToolBar() {
&amp;nbsp; JToolBar toolBar = new JToolBar();
&amp;nbsp; toolBar.setLayout(new FlowLayout(FlowLayout.CENTER));
&amp;nbsp; 
&amp;nbsp; // button add TPK 1
&amp;nbsp; JButton buttonTPK1 = new JButton("Add TPK Topographic");
&amp;nbsp; buttonTPK1.addActionListener(new ActionListener() {
&amp;nbsp;&amp;nbsp; public void actionPerformed(ActionEvent e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; // reset the map
&amp;nbsp;&amp;nbsp;&amp;nbsp; resetMap();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; // add tiled layer
&amp;nbsp;&amp;nbsp;&amp;nbsp; ArcGISLocalTiledLayer tiledLayer = new ArcGISLocalTiledLayer(TPK_BASEMAP_1);
&amp;nbsp;&amp;nbsp;&amp;nbsp; tiledLayer.setName(TPK_BASEMAP_1);
&amp;nbsp;&amp;nbsp;&amp;nbsp; tiledLayer.addLayerInitializeCompleteListener(new LayerListener());
&amp;nbsp;&amp;nbsp;&amp;nbsp; map.getLayers().add(tiledLayer);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; });
&amp;nbsp; toolBar.add(buttonTPK1);
&amp;nbsp; 
&amp;nbsp; // button Add TPK 2
&amp;nbsp; JButton buttonTPK2 = new JButton("Add TPK SanFrancisco");
&amp;nbsp; buttonTPK2.addActionListener(new ActionListener() {
&amp;nbsp;&amp;nbsp; public void actionPerformed(ActionEvent e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; // reset the map
&amp;nbsp;&amp;nbsp;&amp;nbsp; resetMap();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; // add tiled layer
&amp;nbsp;&amp;nbsp;&amp;nbsp; ArcGISLocalTiledLayer tiledLayer = new ArcGISLocalTiledLayer(TPK_BASEMAP_2);
&amp;nbsp;&amp;nbsp;&amp;nbsp; tiledLayer.setName(TPK_BASEMAP_2);
&amp;nbsp;&amp;nbsp;&amp;nbsp; tiledLayer.addLayerInitializeCompleteListener(new LayerListener());
&amp;nbsp;&amp;nbsp;&amp;nbsp; map.getLayers().add(tiledLayer);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; });
&amp;nbsp; toolBar.add(buttonTPK2);
&amp;nbsp; 
&amp;nbsp; return toolBar;
 }
 
 /**
&amp;nbsp; * Creates a content pane.
&amp;nbsp; * @return a content pane.
&amp;nbsp; */
 private JLayeredPane createContentPane() {
&amp;nbsp; JLayeredPane contentPane = new JLayeredPane();
&amp;nbsp; contentPane.setLayout(new BorderLayout(0, 0));
&amp;nbsp; contentPane.setVisible(true);
&amp;nbsp; return contentPane;
 }

 /**
&amp;nbsp; * Reset the map :
&amp;nbsp; *&amp;nbsp; - remove and dispose resources 
&amp;nbsp; *&amp;nbsp; - create new map 
&amp;nbsp; *&amp;nbsp; - remove and add on panel (container)
&amp;nbsp; */
 private void resetMap() {
&amp;nbsp; System.out.println("-actionPerformed - RESET MAP !");
&amp;nbsp; 
&amp;nbsp; if (map != null) {
&amp;nbsp;&amp;nbsp; // remove all layers
&amp;nbsp;&amp;nbsp; for (int i = (this.map.getLayers().size() - 1) ; i == 0 ; i--) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; this.map.getLayers().remove(i);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; // dispose data ressources
&amp;nbsp;&amp;nbsp; this.map.dispose(); 
&amp;nbsp;&amp;nbsp; // &lt;STRONG&gt;=&amp;gt;&amp;gt; ISSUE HERE : dispose() seems to be fired on the new map after createMap() below&amp;nbsp; (see Console prints)&lt;/STRONG&gt;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; // remove map from content pane
&amp;nbsp;&amp;nbsp; this.contentPane.remove(map);
&amp;nbsp; }
&amp;nbsp; 
&amp;nbsp; // re-create the map
&amp;nbsp; this.map = createMap();
&amp;nbsp; // &lt;STRONG&gt;=&amp;gt;&amp;gt; ISSUE HERE : can I avoid a new JMap to re-initialize the map (no spatial ref, no fullextent, etc.) ??&lt;/STRONG&gt; 
&amp;nbsp; 
&amp;nbsp; // add new map to the content pane
&amp;nbsp; this.contentPane.add(map);
&amp;nbsp; 
&amp;nbsp; // Revalidate the map to perform a hierarchical refresh of all components
&amp;nbsp; this.map.revalidate();
 }
 
 /**
&amp;nbsp; * Create a map with navigator overlay
&amp;nbsp; * @return JMap - the map
&amp;nbsp; */
 private JMap createMap() {
&amp;nbsp; JMap jMap = new JMap();
&amp;nbsp; 
&amp;nbsp; // give an incremental name
&amp;nbsp; jMap.setName("map " + count ++);
&amp;nbsp; 
&amp;nbsp; // Add map event listner
&amp;nbsp; jMap.addMapEventListener(new MapListener());
&amp;nbsp; 
&amp;nbsp; // Add NavigatorOverlay
&amp;nbsp; NavigatorOverlay navigator = new NavigatorOverlay();
&amp;nbsp; jMap.addMapOverlay(navigator);
&amp;nbsp; 
&amp;nbsp; return jMap;
 }
}&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;source code also available in zip file&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 12 Dec 2021 16:47:04 GMT</pubDate>
      <guid>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680847#M2068</guid>
      <dc:creator>JeremieJoalland1</dc:creator>
      <dc:date>2021-12-12T16:47:04Z</dc:date>
    </item>
    <item>
      <title>Re: Best practice to reset a map</title>
      <link>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680848#M2069</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I'm afraid is not as simple as you tried it, and not as simple to discuss here. For starters, any MapOverlay extension does not need to contain a JMap because its super already contains it. Simply call getMap(). It'll probably be null if it has not been added to the JMap on main. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If you want to know how it is done, look at the code! The SDK which comes with the toolkit jar also comes with the source files for the toolkit. You have to associate the source file to the referenced toolkit on your project though eclipse in order to see it. On this &lt;/SPAN&gt;&lt;A href="http://forums.arcgis.com/threads/80904-How-to-define-location-for-an-Overlay"&gt;post&lt;/A&gt;&lt;SPAN&gt;, I mentioned how to do that. I'm enclosing the source file of the NavigatorOverlay class which is rather complicated but can be studied.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;P.S. Nice touch on your "onMouseWheelMoved" method. I'll be using that to override mouse wheel actions I need.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 12 Apr 2013 15:56:28 GMT</pubDate>
      <guid>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680848#M2069</guid>
      <dc:creator>CarlosColón-Maldonado</dc:creator>
      <dc:date>2013-04-12T15:56:28Z</dc:date>
    </item>
    <item>
      <title>Re: Best practice to reset a map</title>
      <link>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680849#M2070</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;If you change your dispose event handler to use the map reference from the event you will get the correct output e.g.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;System.out.println(String.format("-MapEventListener- Map '%s' is disposed !", &lt;/SPAN&gt;&lt;STRONG&gt;((JMap)event.getSource()).&lt;/STRONG&gt;&lt;SPAN&gt;getName()));&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;By the time this event has fired you have pointed map at a new instance of JMap with the line this.map = createMap() so the name given is that of the new map not the one being disposed.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Apr 2013 09:27:07 GMT</pubDate>
      <guid>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680849#M2070</guid>
      <dc:creator>ColinAnderson1</dc:creator>
      <dc:date>2013-04-18T09:27:07Z</dc:date>
    </item>
    <item>
      <title>Re: Best practice to reset a map</title>
      <link>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680850#M2071</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;BLOCKQUOTE class="jive-quote"&gt;If you change your dispose event handler to use the map reference from the event you will get the correct output&lt;/BLOCKQUOTE&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;STRONG&gt;Exact&lt;/STRONG&gt;&lt;SPAN&gt;. Thanks for noticing it... now I get correct map name for dispose event, when out.printing in my console.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any inputs for the second question : &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; - &lt;/SPAN&gt;&lt;STRONG&gt;How to perform similar reset, without instanciate a new JMap ?&lt;/STRONG&gt;&lt;SPAN&gt; a kind of re-initialize the JMap...&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Apr 2013 13:18:15 GMT</pubDate>
      <guid>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680850#M2071</guid>
      <dc:creator>JeremieJoalland1</dc:creator>
      <dc:date>2013-04-18T13:18:15Z</dc:date>
    </item>
    <item>
      <title>Re: Best practice to reset a map</title>
      <link>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680851#M2072</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;It's not possible to do this at the moment; there is no 'reset'&amp;nbsp; method on the JMap class. It's something we are considering for a future release.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 24 Apr 2013 09:14:16 GMT</pubDate>
      <guid>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680851#M2072</guid>
      <dc:creator>GayleYoung</dc:creator>
      <dc:date>2013-04-24T09:14:16Z</dc:date>
    </item>
    <item>
      <title>Re: Best practice to reset a map</title>
      <link>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680852#M2073</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;BLOCKQUOTE class="jive-quote"&gt;It's not possible to do this at the moment; there is no 'reset'&amp;nbsp; method on the JMap class. It's something we are considering for a future release.&lt;/BLOCKQUOTE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks for the confirmation... it will definitly be something useful for us in future release !&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 24 Apr 2013 11:08:19 GMT</pubDate>
      <guid>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680852#M2073</guid>
      <dc:creator>JeremieJoalland1</dc:creator>
      <dc:date>2013-04-24T11:08:19Z</dc:date>
    </item>
    <item>
      <title>Re: Best practice to reset a map</title>
      <link>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680853#M2074</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hy Gayle,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What is the status regarding a 'reset'&amp;nbsp; method on the JMap class ?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 21 Aug 2014 07:39:32 GMT</pubDate>
      <guid>https://community.esri.com/t5/java-maps-sdk-questions/best-practice-to-reset-a-map/m-p/680853#M2074</guid>
      <dc:creator>JeremieJoalland1</dc:creator>
      <dc:date>2014-08-21T07:39:32Z</dc:date>
    </item>
  </channel>
</rss>

