Primefaces - Gmaps : não é possível obter informações do Marcador

2 respostas
rafaelvascon

Boa tarde,

Estou seguindo o exemplo dado pelo primefaces para conseguir informações do marcador no mapa: http://www.primefaces.org/showcase/ui/gmapInfoWindow.jsf Os códigos utilizados são os seguintes:
public void onMarkerSelect(OverlaySelectEvent event) {
                marker = (Marker) event.getOverlay();
                if (event != null){
                    System.out.println("O evento nao é nulo ");
                    if (event.getOverlay() != null)
                        System.out.println(" e O overlay nao é nulo");
                    else System.out.println(", mas o overlay é nulo");
                } else System.out.println("O evento é nulo");
                
    }
<p:gmap center="-9, -70.6" zoom="6" type="ROADMAP" style="border:solid 1px ;width:100%;height:450px" 
                        model="#{criacaoSuinosMapaBean.todos}" id="mapa" widgetVar="mapa"
                        overlaySelectListener="#{criacaoSuinosMapaBean.onMarkerSelect}" >
                    
                    <p:gmapInfoWindow>  
                        <p:outputPanel style="display:block;margin:auto;">  
                            <h:panelGrid>
                                <h:outputLabel value="#{bundle.CreatePessoaLabel_nome}" for="nomeP" />
                                <h:outputText id="nomeP" value="#{criacaoSuinosMapaBean.criacaoSuinos.propriedadeidPropriedade.pessoaidPessoaidPessoa.nome}"/>
                                          .
                                          .
                                          .
                                          .
                                        </h:outputText>
                            </h:panelGrid>                  
                        </p:outputPanel>  

                    </p:gmapInfoWindow> 
                </p:gmap>

O que acontece:
O primeiro código (da classe CriacaoSuinosMapaBean) dá pra perceber que faz testes se os objetos recebidos com a ação são falsos.
O resultado ao clicar em um marcador no mapa é:

O evento nao é nulo
, mas o overlay é nulo

Ou seja: meu overlay está vindo nulo. Alguém poderia me ajudar e dizer pq? E como corrigir?

2 Respostas

fillipe.soares

Não sei se vc ainda está com este problema, mas de repente posso te ajudar com isso!

Poderia postar todo o seu Managed Bean?

Um dos problemas que podem levar a um retorno de Overlay = NULL pode estar relacionado a sua instancia do seu MapModel.
Mesmo que seu event não esteja nulo, ele só retornará seu overlay caso exista um objeto MapModel instanciado em seu ManagedBean com o Marker selecionado no seu evento.

Verifique se vc criou a instância de MapModel no construtor do seu Bean ou em outro local.
Também verifique se o escopo do seu Bean está como RequestScoped, pois se estiver lembre-se q de acordo com o ciclo de vida do JSF todos os atributos do seu Bean são renovados ao fim de cada Requisição.

rafaelvascon

Como fiquei com esse problema por um dia inteiro e não se tratava de um requisito do usuário (apenas uma ideia minha) eu deixei pra lá esse problema.
Mas, sempre é interessante conhecer mais, então, segue aí o código do managedBean:

package visao.relatorios;

import controlador.CriacaoSuinosJpaController;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import modelo.CriacaoSuinos;
import org.primefaces.event.map.OverlaySelectEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

/**
 *
 * @author rafael
 */

@ManagedBean(name = "criacaoSuinosMapaBean")
@RequestScoped
public class CriacaoSuinosMapaBean implements Serializable{

    private CriacaoSuinosJpaController jpaController = null;
    
    private MapModel todos;
    private Marker marker;
    private CriacaoSuinos criacaoSuinos;
    
    EntityManagerFactory em = null;
    
    String log =  "";
    private LatLng latlong;
    
    /** Creates a new instance of CriacaoSuinosMapaBean */
    public CriacaoSuinosMapaBean() {
    }
    
    private CriacaoSuinosJpaController getJpaController() {
        if (jpaController == null) {
            jpaController = new CriacaoSuinosJpaController(getEm());
        }        
        return jpaController;
    }
    
    public EntityManagerFactory getEm() {
        if (em == null){
            em = Persistence.createEntityManagerFactory("SEMSA_LICITACOESPU");
        }
        return em;
    }

    public MapModel getTodos() {
        
        if (todos == null){
            todos = new DefaultMapModel(); 
        }
        
        todos.getMarkers().clear();
        
        List<CriacaoSuinos> itens = getItens();
        String requestContextPath = FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath();
        for (CriacaoSuinos item: itens){
            latlong = new LatLng(getLatitude(item), getLongitude(item));
            todos.addOverlay(new Marker(latlong, item.getIdcriacaoSuinos().intValue()+"-" +item.getPropriedadeidPropriedade().getPessoaidPessoa().getNome()
                            ,""
                            ,requestContextPath+ "/icones/fatcow/16x16/bullet_red.png")); //ICON
        }
        
        return todos;
    }
    
    public List<CriacaoSuinos> getItens(){
        return getJpaController().findCriacaoSuinosEntities();
    }
    
    public double getLatitude(CriacaoSuinos item){
         String latitude = item.getPropriedadeidPropriedade().getLatitude();
         // . . .
        //aqui ele converte
        //. . .
        return grausDecimais;
    }
    
    public double getLongitude(CriacaoSuinos item){
        String longitude = item.getPropriedadeidPropriedade().getLongitude();
        // . . .
        return grausDecimais;
    }
    
    public void onMarkerSelect(OverlaySelectEvent event) {
                marker = (Marker) event.getOverlay();
            
                if (event != null){
                    System.out.println("O evento nao é nulo ");
                    if (event.getOverlay() != null)
                        System.out.println(" e O overlay nao é nulo");
                    else System.out.println(", mas o overlay é nulo");
                } else System.out.println("O evento é nulo");
                
    }
       
    public Marker getMarker() {
        if (marker == null) marker = new Marker(new LatLng(0, 0));
        return marker;  
    }
    
    public CriacaoSuinos getCriacaoSuinos(){
        if (criacaoSuinos == null)
            criacaoSuinos = new CriacaoSuinos();
        return criacaoSuinos;
    }
    
    
}
Criado 5 de dezembro de 2011
Ultima resposta 2 de fev. de 2012
Respostas 2
Participantes 2