操作方法

操作方法:在 MapObjects-Java 中为动态图层创建图例

Last Published: January 11, 2021

摘要

注: 本文中的信息适用于已停用产品 MapObjects。

在使用 MapObjects-Java Standard Edition (MOJ) 时,可以创建图形要素并将其动态显示在 Map 组件(例如 acetate 图层)中。 要管理动态图层的显示,开发人员可能需要在 TOC 中创建图例以表示该图层。 创建动态图层图例的技术在难度和功能上会有所不同,具体取决于创建图层的方法。 可以使用以下三种主要技术:

  • 使用 FeatureLayer 并由 MapObjects-Java 管理图例
  • 添加 GraphicsLayer,例如 LayerEvent
  • 重新构建 TOC

过程

使用 FeatureLayer 并由 MapObjects-Java 管理图例

此技术是创建动态图层图例的最简单方法。

在将创建动态图层创建为 FeatureLayer(例如 BaseFeatureLayer),并将其添加至 Map 组件时,新图例将自动添加至 Map 的 TOC。 使用位于磁盘上的数据(例如 shapefile 或 ArcSDE 图层),动态 FeatureLayer 将与 FeatureLayer 具有相同的属性。 图例也可以以相同的方式进行管理。

使用 LayerEvent 添加 GraphicsLayer

在将动态图层创建为 GraphicsLayer 时,通常会在将其添加至 Map 之前将其与 AcetateLayer 对象相关联。 默认情况下,将不会为 GraphicsLayer 创建图例。 要为 GraphicsLayer 添加图例,可以由 Map 组件创建并处理新的 LayerEvent。 LayerEvent 将通知 Map 组件的 LayerListener 已从地图添加、移动或删除图层。 可以使用以下代码将 GraphicsLayer 的图例添加至 TOC 组件:

代码: 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);

下图提供了使用 LayerEvent 添加 GraphicsLayer 之后的 MapObjects-Java 应用程序接口示例:

[O-Image] graphics_layer_example

该图例将不包含符号样本,并且在处理 LayerEvent 之前,Map 必须具有注册的 TOC。 此外,必须将 TocListener 添加至 TOC,以侦听有关动态图层图例的事件。 例如:根据复选框的状态设置图层可见性。 如果图例不需要符号样本或者动态图层为 GraphicsLayer,并且开发人员不想从头开始创建 TOC(请参阅下一方法),则可以使用此技术。

重新构建 TOC

如果使用根据 AcetateLayer 创建的动态图层,或者 GraphicsLayer 的图例需要显示符号样本,则必须重新构建 TOC 组件以添加图例条目。 TOC 本质上为 JScrollPane,其中包含主 JPanel,由一个或多个辅助 JPanel (Legend) 组成。 可以从头开始创建 TOC 及其组件,例如 Legends 和 Listeners,或者将现有 TOC 组件包含在新的主 JPanel 中。 要包含现有 TOC 组件,请执行以下操作: 包含示例代码:

  1. 检索当前 TOC 组件。
Component component = aToc.getViewport().getView();
  1. 创建新的主 JPanel。 此 JPanel 将包含多个辅助 JPanel 作为动态图层图例,以及现有 TOC 图例。 最终,现有 TOC 组件的内容将被设置为新的主 JPanel(步骤 4)。
JPanel jpp = new JPanel(); jpp.setLayout(new BorderLayout()); jpp.add(component,BorderLayout.NORTH);
  1. 创建一个新的 JPanel 以表示每个图层,包括动态图层。 作为开发人员,您可以选择所使用的复选框、标题和符号的类型。 如果使用了 AcetateLayer,则可以通过将其添加至 Map 组件或从 Map 组件中将其移除来设置其可见性。 可以使用 setVisible() 方法来设置 GraphicsLayer 的可见性。 添加此 JPanel 作为在上一步中创建的 JPanel 的辅助对象。 另外,请确保根据需要添加相应的侦听器,例如添加 ActionListener 以确定是否选中该复选框。 以下代码演示了为 AcetateLayer 创建 JPanel。

    示例代码:

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. * 例如,选择一个图例以使其处于活动状态。 */ // 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. 为动态图层创建新 JPanel 后,将其添加至主 JPanel,然后将主 JPanel 与现有 TOC 相关联。
Dynamic_Layer dyn_layer = new Dynamic_Layer(myAcetateLayer, map1); jpp.add(dyn_layer, BorderLayout.CENTER); aToc.setViewportView(jpp);

如果 AcetateLayer 需要图例条目或者需要完全自定义 TOC,则可以使用此技术。

文章 ID:000006150

从 ArcGIS 专家处获得帮助

联系技术支持部门

下载 Esri 支持应用程序

转至下载选项

相关信息

发现关于本主题的更多内容