Instrução
Nota: As informações neste artigo se aplicam a MapObjects de produtos retirados.
Ao usar o MapObjects-Java Standard Edition (MOJ), as feições gráficas podem ser criadas e exibidas dinamicamente em um componente de mapa, como uma camada de acetato. Para gerenciar a exibição de uma camada dinâmica, um desenvolvedor pode desejar criar uma legenda para representar a camada em uma Área de Controle. As técnicas para criar uma legenda de camada dinâmica variam em dificuldade e funcionalidade, dependendo do método usado para criar a camada. Três técnicas principais estão disponíveis:
Utilize FeatureLayer e deixe MapObjects-Java gerenciar a legenda
Esta técnica é o método mais fácil para criar uma legenda de camada dinâmica.
Ao criar uma camada dinâmica como FeatureLayer (por exemplo: BaseFeatureLayer) e adicioná-la a um componente Map, uma nova legenda será adicionada automaticamente à Área de Controle do mapa. Um FeatureLayer dinâmico terá as mesmas propriedades de um FeatureLayer usando dados localizados no disco, como shapefile ou camada ArcSDE. As lendas também podem ser gerenciadas da mesma maneira.
Adicionar um GraphicsLayer utilizando um LayerEvent
Ao criar uma camada dinâmica como GraphicsLayer, ela geralmente é associada a um objeto AcetateLayer antes de ser adicionada a um Mapa. Por padrão, nenhuma legenda é criada para um GraphicsLayer. Para adicionar uma legenda para um GraphicsLayer, um novo LayerEvent pode ser criado e processado por um componente Map. Um LayerEvent informa ao LayerListener do componente Mapa que uma camada foi adicionada, movida ou excluída de um Mapa. Uma legenda para um GraphicsLayer pode ser adicionada a um componente Área de Controle usando o seguinte 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);
A imagem a seguir fornece um exemplo de uma interface de aplicativo MapObjects-Java depois que um GraphicsLayer foi adicionado usando um LayerEvent:
A legenda não conterá uma amostra de símbolo e um Mapa deve ter uma Área de Controle registrado antes que o LayerEvent possa ser processado. Além disso, um TocListener deve ser adicionado à Área de Controle para ouvir eventos na legenda da camada dinâmica. Por exemplo: defina a visibilidade da camada dependendo do estado da caixa de seleção. Esta técnica pode ser usada se a legenda não precisar de uma amostra de símbolo ou se a camada dinâmica for um GraphicsLayer e o desenvolvedor não quiser criar uma Área de Controle do início (consulte o próximo método).
Reconstruir uma Área de Controle
Se estiver usando uma camada dinâmica criada a partir de um AcetateLayer ou se a legenda de um GraphicsLayer precisar exibir uma amostra de símbolo, o componente Área de Controle deve ser reconstruída para adicionar uma entrada de legenda. A Área de Controle é essencialmente um JScrollPane contendo um JPanel primário que consiste em um ou mais JPanels secundários (Legendas). A Área de Controle e seus componentes, como Legendas e Ouvintes, podem ser criados do zero ou o componente Área de Controle existente pode ser incluído no novo JPanel primário. Para incluir os componentes Área de Controle existentes, faça o seguinte. O código de amostra é incluído:
Componente component = aToc.getViewport().getView();
JPanel jpp = new JPanel(); jpp.setLayout(new BorderLayout()); jpp.add(component,BorderLayout.NORTH);
Código de amostra:
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; // Defina o gerenciador de layout do 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); // Após remover o AcetateLayer, o mapa precisará ser pintado novamente m_map.repaint(); m_map.redraw(); } } }); // Construct the legend label JTextField jtf = new JTextField("MyLayer"); jtf.setEditable(false); // Adicione os componentes, defina a cor e o tamanho da legenda this.add(jcb); this.add(jtf); //setBackground(Color.lightGray); setPreferredSize(new Dimension(140, 50)); /* Adicione um MouseListener para ouvir a interação do mouse com a legenda JPanel. * Por exemplo, selecionar uma legenda para torná-la ativa. */ // addMouseListener(myMouseAdapter); } public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // Adicione a amostra de símbolo ao componente da legenda 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);
Essa técnica pode ser usada se um AcetateLayer precisar de uma entrada de legenda ou se o conteúdo de uma Área de Trabalho precisar ser totalmente personalizado.
Obtenha ajuda de especialistas do ArcGIS
Baixe o Esri Support App