操作方法
注: 本文中的信息适用于已停用产品 MapObjects。
在使用 MapObjects-Java Standard Edition (MOJ) 时,可以创建图形要素并将其动态显示在 Map 组件(例如 acetate 图层)中。 要管理动态图层的显示,开发人员可能需要在 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 应用程序接口示例:
该图例将不包含符号样本,并且在处理 LayerEvent 之前,Map 必须具有注册的 TOC。 此外,必须将 TocListener 添加至 TOC,以侦听有关动态图层图例的事件。 例如:根据复选框的状态设置图层可见性。 如果图例不需要符号样本或者动态图层为 GraphicsLayer,并且开发人员不想从头开始创建 TOC(请参阅下一方法),则可以使用此技术。
重新构建 TOC
如果使用根据 AcetateLayer 创建的动态图层,或者 GraphicsLayer 的图例需要显示符号样本,则必须重新构建 TOC 组件以添加图例条目。 TOC 本质上为 JScrollPane,其中包含主 JPanel,由一个或多个辅助 JPanel (Legend) 组成。 可以从头开始创建 TOC 及其组件,例如 Legends 和 Listeners,或者将现有 TOC 组件包含在新的主 JPanel 中。 要包含现有 TOC 组件,请执行以下操作: 包含示例代码:
Component component = aToc.getViewport().getView();
JPanel jpp = new JPanel(); jpp.setLayout(new BorderLayout()); jpp.add(component,BorderLayout.NORTH);
示例代码:
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); } }
Dynamic_Layer dyn_layer = new Dynamic_Layer(myAcetateLayer, map1); jpp.add(dyn_layer, BorderLayout.CENTER); aToc.setViewportView(jpp);
如果 AcetateLayer 需要图例条目或者需要完全自定义 TOC,则可以使用此技术。
从 ArcGIS 专家处获得帮助
下载 Esri 支持应用程序