Instrução

Criar legendas para camadas dinâmicas no MapObjects-Java

Last Published: January 11, 2021

Resumo

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:

  • Use um FeatureLayer e deixe o MapObjects-Java gerenciar a legenda
  • Adicione um GraphicsLayer, como um LayerEvent
  • Reconstruir a Área de Controle

Procedimento

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:

[O-Image] graphics_layer_example

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:

  1. Recupere o componente Área de Controle atual.
Componente component = aToc.getViewport().getView();
  1. Crie um novo JPanel primário. Este JPanel conterá vários JPanels secundários como legendas de camada dinâmica, bem como legendas de Área de Controle existentes. Por fim, o conteúdo do componente Área de Controle existente será definido para o novo JPanel primário (Etapa 4).
JPanel jpp = new JPanel(); jpp.setLayout(new BorderLayout()); jpp.add(component,BorderLayout.NORTH);
  1. Crie um novo JPanel para representar cada camada, incluindo a camada dinâmica. Como desenvolvedor, você pode escolher o tipo de caixa de seleção, título e símbolo usado. Se um AcetateLayer for usado, sua visibilidade é definida adicionando-o e removendo-o do componente Mapa. A visibilidade de um GraphicsLayer pode ser definida usando o método setVisible(). Adicione este JPanel como secundário ao JPanel criado na etapa anterior. Além disso, certifique-se de adicionar os ouvintes apropriados conforme necessário, como adicionar um ActionListener para determinar se a caixa de seleção está marcada. O código a seguir ilustra a criação de um JPanel para um AcetateLayer.

    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); } }
  1. Depois que o novo JPanel da camada dinâmica for criado, adicione-o ao JPanel primário e, a seguir, associe o JPanel primário à Área de Controle existente.
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.

ID do Artigo:000006150

Obtenha ajuda de especialistas do ArcGIS

Entre em contato com suporte técnico

Baixe o Esri Support App

Ir para opções de download

Informações Relacionadas

Descubra mais sobre este tema