HOW TO

Erstellen von Legenden für dynamische Layer in MapObjects-Java

Last Published: January 11, 2021

Zusammenfassung

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
  • Hinzufügen eines GraphicsLayer, wie zum Beispiel eines LayerEvent-Ereignisses
  • Rekonstruieren des TOC

Vorgehensweise

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:

[O-Abbildung] graphics_layer_example

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:

  1. Rufen Sie die aktuelle TOC-Komponente ab.
Component component = aToc.getViewport().getView();
  1. Erstellen Sie ein neues primäres JPanel. Dieses JPanel enthält mehrere sekundäre JPanels als Legenden des dynamischen Layers sowie vorhandene TOC-Legenden. Zuletzt wird als Inhalt der vorhandenen TOC-Komponente das neue primäre JPanel festgelegt (Schritt 4).
JPanel jpp = new JPanel(); jpp.setLayout(new BorderLayout()); jpp.add(component,BorderLayout.NORTH);
  1. Erstellen Sie ein neues JPanel zur Darstellung jedes Layers, einschließlich des dynamischen Layers. Als Entwickler können Sie den Typ der verwendeten Kontrollkästchen, Titel und Symbole festlegen. Wenn ein AcetateLayer verwendet wird, wird dessen Sichtbarkeit festgelegt, indem er in der Kartenkomponente hinzugefügt oder entfernt wird. Die Sichtbarkeit eines GraphicsLayer kann mit der Methode setVisible() festgelegt werden. Fügen Sie dieses JPanel als sekundäres JPanel dem im vorherigen Schritt erstellten JPanel hinzu. Vergessen Sie auch nicht, die benötigten Listener hinzuzufügen, wie zum Beispiel einen ActionListener, der ermittelt, ob das Kontrollkästchen aktiviert ist. Der folgende Code zeigt, wie ein JPanel für einen AcetateLayer erstellt wird.

    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); } }
  1. Nachdem das neue JPanel für den dynamischen Layer erstellt wurde, fügen Sie es dem primären JPanel hinzu und verknüpfen das primäre JPanel mit dem vorhandenen TOC.
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.

Artikel-ID:000006150

Hilfe von ArcGIS-Expert*innen erhalten

Technischen Support kontaktieren

Die Esri Support-App herunterladen

Zu den Download-Optionen

Zugehörige Informationen

Weitere Informationen zu diesem Thema erkunden