CÓMO

Crear leyendas para capas dinámicas en MapObjects-Java

Last Published: January 11, 2021

Resumen

Nota: La información de este artículo se aplica a un producto retirado, MapObjects.

Al utilizar MapObjects-Java Standard Edition (MOJ), las entidades gráficas se pueden crear y visualizar dinámicamente en un componente de mapa, como una capa de acetato. Para administrar la visualización de una capa dinámica, es posible que un desarrollador desee crear una leyenda para representar la capa en una Tabla de contenido. Las técnicas para crear una leyenda de capa dinámica varían en dificultad y funcionalidad, dependiendo del método utilizado para crear la capa. Hay tres técnicas principales disponibles:

  • Usar FeatureLayer y dejar que MapObjects-Java administre la leyenda
  • Agregar una GraphicsLayer, como un LayerEvent
  • Reconstruir la Tabla de contenido

Procedimiento

Usar FeatureLayer y dejar que MapObjects-Java administre la leyenda

Esta técnica es el método más sencillo para crear una leyenda de capa dinámica.

Al crear una capa dinámica como FeatureLayer, (por ejemplo: BaseFeatureLayer) y agregarla a un componente de mapa, se agregará automáticamente una nueva leyenda a la Tabla de contenido del mapa. Una capa de entidad dinámica tendrá las mismas propiedades que una FeatureLayer que utiliza los datos ubicados en el disco, como un shapefile o una capa de ArcSDE. Las leyendas también se pueden administrar del mismo modo.

Agregar una GraphicsLayer mediante un LayerEvent

Al crear una capa dinámica como GraphicsLayer, generalmente se asocia con un objeto AcetateLayer antes de agregarlo a un mapa. De forma predeterminada, no se crea ninguna leyenda para una GraphicsLayer. Para agregar una leyenda a una GraphicsLayer, un componente de Mapa puede crear y procesar un nuevo evento LayerEvent. Un LayerEvent informa al LayerListener del componente Mapa de que se agregó, movió o eliminó una capa de un mapa. Se puede agregar una leyenda para una GraphicsLayer a un componente de la Tabla de contenido utilizando el siguiente código:

Código: 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);

La siguiente imagen proporciona un ejemplo de interfaz de aplicación MapObjects-Java después de agregar un GraphicsLayer utilizando un LayerEvent:

[O-Image] Graphics_layer_example

La leyenda no contendrá un selector de símbolos y un mapa debe tener una Tabla de contenido registrada antes de que se pueda procesar LayerEvent. Además, se debe agregar un TocListener a la Tabla de contenido para escuchar eventos en la leyenda de capa dinámica. Por ejemplo: establecer la visibilidad de capa dependiendo del estado de la casilla de verificación. Esta técnica se puede utilizar si la leyenda no necesita un selector de símbolos o la capa dinámica es una GraphicsLayer y el desarrollador no desea crear una Tabla de contenido desde cero (consulte el siguiente método).

Reconstruir una Tabla de contenido

Si se utiliza una capa dinámica creada a partir de una AcetateLayer, o la leyenda para GraphicsLayer necesita mostrar un selector de símbolos, el componente de tabla de contenido se debe reconstruir para agregar una entrada de leyenda. La Tabla de contenido es esencialmente un JScrollPane que contiene un JPanel principal que consta de uno o más JPanels secundarios (leyendas). La tabla de contenido y sus componentes, como leyendas y escuchas, se pueden crear desde cero o el componente de Tabla de contenido existente se puede incluir en el nuevo JPanel principal. Para incluir los componentes de la Tabla de contenido existentes, haga lo siguiente. Se incluye el código de muestra:

  1. Recuperar el componente actual de la Tabla de contenido.
Component component = aToc.getViewport().getView();
  1. Cree un nuevo JPanel principal. Este JPanel contendrá varios JPanels secundarios como leyendas de capa dinámica, así como las leyendas de Tabla de contenido existentes. Por último, el contenido del componente de la Tabla de contenido existente se establecerá en el nuevo JPanel principal (paso 4).
JPanel jpp = new JPanel(); jpp.setLayout(new BorderLayout()); jpp.add(component,BorderLayout.NORTH);
  1. Cree un nuevo JPanel para representar cada capa, incluida la capa dinámica. Como desarrollador, puede elegir el tipo de casilla de verificación, el título y el símbolo que se utilizan. Si se utiliza una AcetateLayer, su visibilidad se configura agregándola y quítela del componente Mapa. La visibilidad de una GraphicsLayer se puede establecer mediante el método setVisible(). Agregue este JPanel como secundario al JPanel creado en el paso anterior. Además, asegúrese de agregar las escuchas apropiadas según sea necesario, como agregar un ActionListener para determinar si está activada la casilla de verificación. El siguiente código ilustra la creación de un JPanel para una AcetateLayer.

    Código de muestra:

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; // Establecer el gestor de diseño para el JPanel. FlowLayout fl = new FlowLayout(); this.setLayout(fl); fl.setAlignment(FlowLayout.LEFT); fl.setHgap(3); fl.setVgap(1); //Agregar una casilla de verificación con un ActionListener para establecer la visibilidad de la 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); // Después de eliminar la AcetateLayer, es necesario volver a pintar el mapa m_map.repaint(); m_map.redraw(); } } }); // Construir la etiqueta de la leyenda JTextField jtf = new JTextField("MyLayer"); jtf.setEditable(false); // Agregar los componentes, establece el color y el tamaño de la leyenda this.add(jcb); this.add(jtf); //setBackground(Color.lightGray); setPreferredSize(new Dimension(140, 50)); /* Agregar un MouseListener para escuchar la interacción del ratón con la leyenda JPanel. * Por ejemplo, al seleccionar una leyenda para activarla. */ // 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. Una vez que se haya creado el nuevo JPanel para la capa dinámica, agréguela al JPanel principal y, a continuación, asocie el JPanel principal con la Tabla de contenido existente.
Dynamic_Layer dyn_layer = new Dynamic_Layer(myAcetateLayer, map1); jpp.add(dyn_layer, BorderLayout.CENTER); aToc.setViewportView(jpp);

Esta técnica se puede utilizar si una AcetateLayer necesita una entrada de leyenda o el contenido de una tabla de contenido debe personalizarse completamente.

Id. de artículo:000006150

Obtener ayuda de expertos en ArcGIS

Contactar con soporte técnico

Descargar la aplicación de soporte de Esri

Ir a las opciones de descarga

Información relacionada

Descubrir más sobre este tema