HOW TO
Hinweis: Die Informationen in diesem Artikel gelten für das Retired-Produkt MapObjects.
Wenn MapObjects-Java Standard Edition (MOJ) verwendet wird, können grafische Features erstellt und dynamisch in einer Kartenkomponente, wie zum Beispiel einem Azetat-Layer, angezeigt werden. Um die Anzeige eines dynamischen Layers zu steuern, könnte ein Entwickler eine Legende zur Darstellung des Layers in einem Inhaltsverzeichnis (TOC) erstellen. Je nach der Methode, mit der ein Layer erstellt wurde, variieren die Techniken zum Erstellen der Legende des dynamischen Layers hinsichtlich Schwierigkeit und Funktionalität. Primär sind drei Techniken verfügbar:
Verwenden eines Feature-Layers und Verwalten der Legende durch MapObjects-Java
Diese Technik ist die einfachste Methode zum Erstellen der Legende eines dynamischen Layers.
Wenn ein dynamischer Layer als Feature-Layer (zum Beispiel BaseFeatureLayer) erstellt und zu einer Kartenkomponente hinzugefügt wird, wird im TOC der Karte automatisch eine neue Legende hinzugefügt. Ein dynamischer Feature-Layer hat dann dieselben Eigenschaften wie ein Feature-Layer, der Daten von einer Festplatte verwendet, wie zum Beispiel ein Shapefile oder ArcSDE-Layer. Auf die gleiche Weise können auch Legenden verwaltet werden.
Hinzufügen eines GraphicsLayer mit einem LayerEvent
Wenn ein dynamischer Layer als Grafik-Layer (GraphicsLayer) erstellt wird, wird er in der Regel mit einem AcetateLayer-Objekt verknüpft, bevor er einer Karte hinzugefügt wird. Standardmäßig wird für einen GraphicsLayer keine Legende erstellt. Um eine Legende für einen GraphicsLayer hinzuzufügen, kann ein neues LayerEvent-Objekt erstellt und durch eine Kartenkomponente verarbeitet werden. Ein LayerEvent informiert den LayerListener der Kartenkomponente darüber, dass in einer Karte ein Layer hinzugefügt, verschoben oder gelöscht wurde. Eine Legende für einen GraphicsLayer kann mit dem folgenden Code zu einem TOC hinzugefügt werden:
Code: MyGraphicsLayer gLayer = new MyGraphicsLayer(); gLayer.setName("My Graphics Layer"); AcetateLayer acetateLayer = new AcetateLayer(gLayer); aMap.add(acetateLayer); LayerEvent event = new LayerEvent(acetateLayer.getLayer(), LayerEvent.ADD); aMap.getLayerset().processLayerEvent(event);
Die folgende Abbildung zeigt ein Beispiel für eine MapObjects-Java-Anwendungsoberfläche, nachdem ein GraphicsLayer mit einem LayerEvent hinzugefügt wurde:
Die Legende enthält dann keine Symbolpalette. Außerdem muss in der Karte ein TOC registriert sein, bevor das LayerEvent-Objekt verarbeitet werden kann. Zusätzlich muss dem TOC ein TocListener hinzugefügt werden, der die Legende des dynamischen Layers auf Ereignisse überwacht. Beispiel: Festlegen der Layer-Sichtbarkeit in Abhängigkeit vom Zustand des Kontrollkästchens. Diese Technik kann verwendet werden, wenn die Legende keine Symbolpalette benötigt oder der dynamische Layer ein GraphicsLayer ist und der Entwickler kein TOC völlig neu erstellen lassen möchte (siehe nächste Methode).
Rekonstruieren eines TOC
Wenn ein dynamischer Layer verwendet wird, der aus einem AcetateLayer erstellt wurde, oder in der Legende für einen GraphicsLayer eine Symbolpalette angezeigt werden soll, dann muss die TOC-Komponente rekonstruiert werden, um einen Legendeneintrag hinzuzufügen. Als TOC muss immer ein JScrollPane mit einem primären JPanel, das aus einem oder mehreren sekundären JPanels (Legenden) besteht, verwendet werden. Das TOC und seine Komponenten, wie zum Beispiel Legenden und Listener, können völlig neu erstellt werden. Es kann aber auch die vorhandene TOC-Komponente im neuen primären JPanel eingefügt werden. Um die vorhandenen TOC-Komponenten einzufügen, gehen Sie wie folgt vor: Beispielcode wurde eingefügt:
Component component = aToc.getViewport().getView();
JPanel jpp = new JPanel(); jpp.setLayout(new BorderLayout()); jpp.add(component,BorderLayout.NORTH);
Beispielcode:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Dynamic_Layer extends JPanel { //CustomMouseAdapter myMouseAdapter = new CustomMouseAdapter(); com.esri.mo.ui.bean.AcetateLayer m_acetate; com.esri.mo.ui.bean.Map m_map; public Dynamic_Layer(com.esri.mo.ui.bean.AcetateLayer layer, com.esri.mo.ui.bean.Map map) { m_acetate = layer; m_map = map; // Set the layout manager for the JPanel. FlowLayout fl = new FlowLayout(); this.setLayout(fl); fl.setAlignment(FlowLayout.LEFT); fl.setHgap(3); fl.setVgap(1); //Add a check box with an ActionListener to set the visibility of the AcetateLayer final JCheckBox jcb = new JCheckBox(); jcb.setSelected(true); jcb.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ if (jcb.isSelected()) { m_map.add(m_acetate); m_map.redraw(); } else { m_map.remove((Component) m_acetate); // After removing the AcetateLayer, the Map needs to be repainted m_map.repaint(); m_map.redraw(); } } }); // Construct the legend label JTextField jtf = new JTextField("MyLayer"); jtf.setEditable(false); // Add the components, set the color and size of the legend this.add(jcb); this.add(jtf); //setBackground(Color.lightGray); setPreferredSize(new Dimension(140, 50)); /* Add a MouseListener to listen for mouse interaction with the legend JPanel. * For example, selecting a legend to make it active. */ // addMouseListener(myMouseAdapter); } public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // Add the symbol swatch to the legend component java.awt.geom.Area e = new java.awt.geom.Area(new java.awt.geom.Rectangle2D.Double(17,25,15,15)); g2d.setColor(new Color(0,20,250)); g2d.fill(e); g2d.setColor(new Color(0, 0, 0)); g2d.draw(e); } }
Dynamic_Layer dyn_layer = new Dynamic_Layer(myAcetateLayer, map1); jpp.add(dyn_layer, BorderLayout.CENTER); aToc.setViewportView(jpp);
Diese Technik kann verwendet werden, wenn ein AcetateLayer einen Legendeneintrag benötigt oder der Inhalt eines TOC vollständig angepasst werden muss.
Hilfe von ArcGIS-Expert*innen erhalten
Die Esri Support-App herunterladen