Skip to content

Commit 4b1298d

Browse files
authored
Manage Operational Layers: UI not working as described (#562)
* alter the functionality for reordering layers * code review amends * change initial viewpoint location * creation of image layers listener * comment correction
1 parent 55b379f commit 4b1298d

File tree

2 files changed

+121
-92
lines changed

2 files changed

+121
-92
lines changed
Lines changed: 115 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
/*
22
* Copyright 2017 Esri.
3-
*
3+
*
44
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
55
* use this file except in compliance with the License. You may obtain a copy of
66
* the License at
7-
*
7+
*
88
* http://www.apache.org/licenses/LICENSE-2.0
9-
*
9+
*
1010
* Unless required by applicable law or agreed to in writing, software
1111
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
1212
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -17,11 +17,13 @@
1717
package com.esri.samples.manage_operational_layers;
1818

1919
import java.util.ArrayList;
20+
import java.util.Arrays;
2021

2122
import javafx.application.Application;
2223
import javafx.geometry.Insets;
2324
import javafx.geometry.Pos;
2425
import javafx.scene.Scene;
26+
import javafx.scene.control.Alert;
2527
import javafx.scene.control.Label;
2628
import javafx.scene.control.ListView;
2729
import javafx.scene.input.MouseButton;
@@ -35,134 +37,156 @@
3537

3638
import com.esri.arcgisruntime.layers.ArcGISMapImageLayer;
3739
import com.esri.arcgisruntime.layers.Layer;
40+
import com.esri.arcgisruntime.loadable.LoadStatus;
3841
import com.esri.arcgisruntime.mapping.ArcGISMap;
3942
import com.esri.arcgisruntime.mapping.Basemap;
4043
import com.esri.arcgisruntime.mapping.LayerList;
44+
import com.esri.arcgisruntime.mapping.Viewpoint;
4145
import com.esri.arcgisruntime.mapping.view.MapView;
4246

4347
public class ManageOperationalLayersSample extends Application {
4448

4549
private MapView mapView;
46-
private LayerList mapAddedLayers;
47-
48-
private static final String ELEVATION_LAYER =
49-
"https://sampleserver5.arcgisonline.com/arcgis/rest/services/Elevation/WorldElevations/MapServer";
50-
private static final String CENSUS_LAYER =
51-
"https://sampleserver5.arcgisonline.com/arcgis/rest/services/Census/MapServer";
52-
private static final String DAMAGE_LAYER =
53-
"https://sampleserver5.arcgisonline.com/arcgis/rest/services/DamageAssessment/MapServer";
5450

5551
@Override
5652
public void start(Stage stage) {
5753

5854
try {
59-
// create stack pane and application scene
55+
// create the stack pane and the application scene
6056
StackPane stackPane = new StackPane();
6157
Scene scene = new Scene(stackPane);
6258
scene.getStylesheets().add(getClass().getResource("/manage_operational_layers/style.css").toExternalForm());
6359

64-
// set title, size, and add scene to stage
60+
// set a title, size, and add the scene to the stage
6561
stage.setTitle("Manage Operational Layers Sample");
6662
stage.setWidth(800);
6763
stage.setHeight(700);
6864
stage.setScene(scene);
6965
stage.show();
7066

71-
// create a control panel
72-
VBox controlsVBox = new VBox(6);
73-
controlsVBox.setBackground(new Background(new BackgroundFill(Paint.valueOf("rgba(0,0,0,0.3)"), CornerRadii.EMPTY,
74-
Insets.EMPTY)));
75-
controlsVBox.setPadding(new Insets(10.0));
76-
controlsVBox.setMaxSize(200, 260);
77-
controlsVBox.getStyleClass().add("panel-region");
67+
// create an ArcGISMap with the topographic basemap
68+
ArcGISMap map = new ArcGISMap(Basemap.createTopographic());
7869

79-
// create labels for add/delete layers
80-
Label addLayersLabel = new Label("Layers on the ArcGISMap");
81-
Label deleteLayersLabel = new Label("Deleted Layers");
82-
addLayersLabel.getStyleClass().add("panel-label");
83-
deleteLayersLabel.getStyleClass().add("panel-label");
70+
// create a view and add the ArcGISMap to it
71+
mapView = new MapView();
72+
mapView.setMap(map);
8473

85-
// create list for deleted layers
74+
// set the initial viewpoint for the map view
75+
mapView.setViewpoint(new Viewpoint(41.056295, -106.195800, 20000000));
76+
77+
// create and add new image layers to the map's operational layers
78+
LayerList mapLayers = map.getOperationalLayers();
79+
mapLayers.addAll(Arrays.asList(
80+
(new ArcGISMapImageLayer("https://sampleserver5.arcgisonline.com/arcgis/rest/services/Elevation/WorldElevations/MapServer")),
81+
(new ArcGISMapImageLayer("https://sampleserver5.arcgisonline.com/arcgis/rest/services/DamageAssessment/MapServer")),
82+
(new ArcGISMapImageLayer("https://sampleserver5.arcgisonline.com/arcgis/rest/services/Census/MapServer"))
83+
));
84+
85+
// check that each layer has loaded correctly and if not display an error message
86+
mapLayers.forEach(layer ->
87+
layer.addDoneLoadingListener(() -> {
88+
if (layer.getLoadStatus() != LoadStatus.LOADED) {
89+
new Alert(Alert.AlertType.ERROR, "Map image layer failed to load: " + layer.getLoadError().getCause().getMessage()).show();
90+
}
91+
})
92+
);
93+
94+
// create a list to hold deleted layers
8695
ArrayList<Layer> deletedLayers = new ArrayList<>();
8796

88-
// create a list view for names of layers added/deleted
89-
ListView<String> addedLayerNames = new ListView<>();
90-
ListView<String> deletedLayerNames = new ListView<>();
91-
92-
addedLayerNames.setOnMouseClicked(e -> {
93-
// index of selected item
94-
int selectedIndex = addedLayerNames.getSelectionModel().getSelectedIndex();
95-
if (e.getButton() == MouseButton.PRIMARY) {
96-
97-
// store selected layer
98-
ArcGISMapImageLayer temp = (ArcGISMapImageLayer) mapAddedLayers.get(selectedIndex);
99-
// remove selected layer
100-
mapAddedLayers.remove(selectedIndex);
101-
// add selected layer to front
102-
mapAddedLayers.add(temp);
103-
104-
// make names match added layers list
105-
String temp2 = addedLayerNames.getItems().get(selectedIndex);
106-
addedLayerNames.getItems().remove(selectedIndex);
107-
addedLayerNames.getItems().add(temp2);
108-
} else if (e.getButton() == MouseButton.SECONDARY) {
109-
110-
// append added layer to deleted list
111-
deletedLayers.add(mapAddedLayers.get(selectedIndex));
112-
// remove layer from added list
113-
mapAddedLayers.remove(selectedIndex);
114-
115-
// make names match corresponding list
116-
deletedLayerNames.getItems().add(addedLayerNames.getSelectionModel().getSelectedItem());
117-
addedLayerNames.getItems().remove(selectedIndex);
118-
}
119-
});
97+
// create a list view to display the list of added and deleted layers by name, and create labels for them
98+
ListView<String> addedLayerNamesList = new ListView<>();
99+
Label addedLayersLabel = new Label("Added layers");
100+
ListView<String> deletedLayerNamesList = new ListView<>();
101+
Label deletedLayersLabel = new Label("Deleted layers");
102+
103+
// add the names of the layers on the map to the list of added layers
104+
// note this should be the reverse order they were added to the map
105+
addedLayerNamesList.getItems().add(mapLayers.get(2).getName());
106+
addedLayerNamesList.getItems().add(mapLayers.get(1).getName());
107+
addedLayerNamesList.getItems().add(mapLayers.get(0).getName());
108+
109+
// create a listener for clicks on the list of added layers
110+
addedLayerNamesList.setOnMouseClicked(e -> {
111+
112+
// if there are added layers
113+
if (!mapLayers.isEmpty() && !addedLayerNamesList.getItems().isEmpty()) {
114+
115+
// get the index of the selected item
116+
int selectedIndex = addedLayerNamesList.getSelectionModel().getSelectedIndex();
117+
118+
// if a valid index is selected
119+
if (selectedIndex >= 0) {
120+
121+
// get the selected layer from the map and its index in the list of operational layers on the map
122+
ArcGISMapImageLayer selectedLayer = (ArcGISMapImageLayer) mapLayers.get(mapLayers.size() - selectedIndex - 1);
123+
int indexOfSelectedLayer = mapLayers.indexOf(selectedLayer);
120124

121-
deletedLayerNames.setOnMouseClicked(e -> {
122-
// index of selected item
123-
int selectedIndex = deletedLayerNames.getSelectionModel().getSelectedIndex();
124-
if (e.getButton() == MouseButton.SECONDARY) {
125+
if (e.getButton() == MouseButton.PRIMARY) {
125126

126-
// append deleted layer to added list
127-
mapAddedLayers.add(deletedLayers.get(selectedIndex));
128-
// remove delete layer from deleted list
129-
deletedLayers.remove(selectedIndex);
127+
// if the layer is not already at the top, move it to the top of the list and layers on the map
128+
if (selectedIndex != 0) {
130129

131-
// make names match corresponding list
132-
addedLayerNames.getItems().add(deletedLayerNames.getSelectionModel().getSelectedItem());
133-
deletedLayerNames.getItems().remove(selectedIndex);
130+
// move the layer's name to the top of the added layers list. Note this is adding to index 0.
131+
addedLayerNamesList.getItems().remove(selectedIndex);
132+
addedLayerNamesList.getItems().add(0, selectedLayer.getName());
133+
134+
// move the layer to the top of the layers on the map. Note this is adding to the last index.
135+
mapLayers.remove(indexOfSelectedLayer);
136+
mapLayers.add(mapLayers.size(), selectedLayer);
137+
138+
// update the UI to keep the current layer selected
139+
addedLayerNamesList.getSelectionModel().select(0);
140+
}
141+
142+
} else if (e.getButton() == MouseButton.SECONDARY) {
143+
144+
// remove the selected layer from the map and add it to the deleted layers
145+
mapLayers.remove(selectedLayer);
146+
deletedLayers.add(selectedLayer);
147+
148+
// remove the selected layer's name from the added layers list and add it to the deleted layers list
149+
addedLayerNamesList.getItems().remove(selectedIndex);
150+
deletedLayerNamesList.getItems().add(selectedLayer.getName());
151+
}
152+
}
134153
}
135154
});
136155

137-
// add labels and lists to the control panel
138-
controlsVBox.getChildren().addAll(addLayersLabel, addedLayerNames, deleteLayersLabel, deletedLayerNames);
156+
// create a listener for clicks on the list of deleted layers
157+
deletedLayerNamesList.setOnMouseClicked(e -> {
139158

140-
// create a ArcGISMap with the basemap Topographic
141-
final ArcGISMap map = new ArcGISMap(Basemap.Type.TOPOGRAPHIC, 34.056295, -117.195800, 14);
159+
// if there are deleted layers
160+
if (!deletedLayers.isEmpty() && !deletedLayerNamesList.getItems().isEmpty()) {
142161

143-
// get the operational layers list from the ArcGISMap
144-
mapAddedLayers = map.getOperationalLayers();
162+
// get the index of the selected layer
163+
int selectedIndex = deletedLayerNamesList.getSelectionModel().getSelectedIndex();
145164

146-
// create a view and added ArcGISMap to it
147-
mapView = new MapView();
148-
mapView.setMap(map);
165+
// if a valid index is selected
166+
if (selectedIndex >= 0) {
149167

150-
// create the elevation, census, and damage default layers
151-
ArcGISMapImageLayer imageLayerElevation = new ArcGISMapImageLayer(ELEVATION_LAYER);
152-
ArcGISMapImageLayer imageLayerCensus = new ArcGISMapImageLayer(CENSUS_LAYER);
153-
ArcGISMapImageLayer imageLayerDamage = new ArcGISMapImageLayer(DAMAGE_LAYER);
168+
if (e.getButton() == MouseButton.SECONDARY) {
154169

155-
// add default ArcGISMap image layers to the ArcGISMap
156-
mapAddedLayers.add(imageLayerElevation);
157-
mapAddedLayers.add(imageLayerCensus);
158-
mapAddedLayers.add(imageLayerDamage);
170+
// add the layer to the map and remove from the deleted layers
171+
mapLayers.add(0, deletedLayers.get(selectedIndex));
172+
deletedLayers.remove(selectedIndex);
159173

160-
// add the default names to added list
161-
addedLayerNames.getItems().add(mapAddedLayers.get(0).getName());
162-
addedLayerNames.getItems().add(mapAddedLayers.get(1).getName());
163-
addedLayerNames.getItems().add(mapAddedLayers.get(2).getName());
174+
// add the selected layer's name to the added layers list and remove it from the deleted layers list
175+
addedLayerNamesList.getItems().add(deletedLayerNamesList.getSelectionModel().getSelectedItem());
176+
deletedLayerNamesList.getItems().remove(selectedIndex);
177+
}
178+
}
179+
}
180+
});
164181

165-
// add the map view and control box to stack pane
182+
// create a control panel and add the label and list UI components
183+
VBox controlsVBox = new VBox(6);
184+
controlsVBox.setBackground(new Background(new BackgroundFill(Paint.valueOf("rgba(0,0,0,0.3)"), CornerRadii.EMPTY,
185+
Insets.EMPTY)));
186+
controlsVBox.getStyleClass().add("panel-region");
187+
controlsVBox.getChildren().addAll(addedLayersLabel, addedLayerNamesList, deletedLayersLabel, deletedLayerNamesList);
188+
189+
// add the map view and control panel to stack pane
166190
stackPane.getChildren().addAll(mapView, controlsVBox);
167191
StackPane.setAlignment(controlsVBox, Pos.TOP_LEFT);
168192
StackPane.setMargin(controlsVBox, new Insets(10, 0, 0, 10));
@@ -192,5 +216,4 @@ public static void main(String[] args) {
192216

193217
Application.launch(args);
194218
}
195-
196219
}

map/manage-operational-layers/src/main/resources/manage_operational_layers/style.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
.panel-region {
2+
-fx-padding: 10;
3+
-fx-max-width: 200;
4+
-fx-max-height: 260;
5+
}
6+
17
.panel-region .label {
28
-fx-text-fill: white;
39
}

0 commit comments

Comments
 (0)