InfoWindow do GMap Primefaces não funciona [RESOLVIDO]

2 respostas
F

Boa noite!

Estou testando os componentes do Primefaces e encontrei um problema: Não consigo criar uma InfoWindow em um Marker no componente GMap do primefaces conforme a documentação. De acordo com o showcase do site, existe uma invocação de um método getMarker() que não existe.

public void onMarkerSelect(OverlaySelectEvent event) {  
        marker = (Marker) event.getMarker();  
    }

Já na documentação em PDF, no lugar de event.getMarker() é chamado o event.getOverlay(), mas este retorna o objeto overlay sempre nulo.
Já pesquisei e as duvidas semelhantes as minhas não foram respondidas, duvidas de 2 ou 3 anos atras.
Alguém aí pode me ajudar?
Segue meu codigo:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>

        <title>teste</title>
    </h:head>
    <h:body>
        <h:form>  
            <p:gmap center="-23.543845,-46.643829" zoom="10" type="hybrid" 
                    style="width:600px;height:400px" model="#{homeController.model}" 
                    overlaySelectListener="#{mapBean.onMarkerSelect}">  
                <p:gmapInfoWindow>  
                    <p:outputPanel style="text-align:center;display:block;margin:auto:">  
                        <p:graphicImage value="/images/#{homeController.marker.data}"/>  
                        <br />  
                        <h:outputText value="#{homeController.marker.title}" />  
                    </p:outputPanel>  
                </p:gmapInfoWindow> 
            </p:gmap> 
            
            <br/> 
            <h:commandButton value="Salvar" action="#{homeController.salvar}"/>

        </h:form>  
    </h:body>
</html>

bean

package br.com.teste.beans;

import br.com.teste.dao.UsuarioDAO;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
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;

@ManagedBean
public class HomeController implements Serializable {

    private MapModel model = new DefaultMapModel();
    private Marker marker;

    public MapModel getModel() {
        model.addOverlay(new Marker(new LatLng(-23.800000, -46.800000), "Teste Marca 2", "balao.jpg"));
        model.addOverlay(new Marker(new LatLng(-23.543845, -46.643829), "Icone customizado", "gene.jpg", "icones/icone.gif"));
        return model;
    }

    public void onMarkerSelect(OverlaySelectEvent event) {
        this.marker = (Marker) event.getOverlay();
    }

    public Marker getMarker() {
        return marker;
    }

    public void setMarker(Marker marker) {
        this.marker = marker;
    }
    
}

2 Respostas

F

Problema resolvido!

Durante meus testes eu havia trocado o local de inicialização dos Overlays do meu mapModel, colocando eles no get do modelo. Na documentação isso é feito no contrutor do Bean.
Coloquei as coisas nos locais corretos e o Overlay não veio mais nulo após o ajax. Acredito que exista diferença entre os dois devido ao ciclo JSF.

Para que as coisas ficassem 100% ainda tive que anotar o Bean com @SessionEscoped, pois com request o infowindow não vinha com dados preenchidos.

Espero que isso seja util p alguem \o/

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
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;

@ManagedBean
@SessionScoped
public class HomeController implements Serializable {

    private MapModel model;
    private Marker marker;

    public HomeController() {
        model = new DefaultMapModel();
        model.addOverlay(new Marker(new LatLng(-23.800000, -46.800000), "Teste Marca 2", "balao.jpg", "http://maps.google.com/mapfiles/ms/micons/yellow-dot.png"));
        model.addOverlay(new Marker(new LatLng(-23.543845, -46.643829), "Icone customizado", "gene.jpg", "icones/icone.gif"));
    }

    public MapModel getModel() {
        return model;
    }

    public void onMarkerSelect(OverlaySelectEvent event) {
        this.marker = (Marker) event.getOverlay();
    }

    public Marker getMarker() {
        return marker;
    }

    public void setMarker(Marker marker) {
        this.marker = marker;
    }
}
W

Cara, preciso de sua ajuda.
Qual o diretório você colocou sua imagem “icones/icone.gif” ?

Criado 22 de dezembro de 2011
Ultima resposta 22 de out. de 2013
Respostas 2
Participantes 2