Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在谷歌地图上放置标记_Java_Google Maps_Jsf 2_Primefaces - Fatal编程技术网

Java 如何在谷歌地图上放置标记

Java 如何在谷歌地图上放置标记,java,google-maps,jsf-2,primefaces,Java,Google Maps,Jsf 2,Primefaces,我使用谷歌地图工具。 我希望我的用户能够在地图上只放置一个标记。 坐标值应存储在托管bean变量中 我该怎么做? 看看我到目前为止做了什么: 我创建了地图: <f:view contentType="text/html"> <p:gmap id="gmap" center="36.890257,30.707417" zoom="13" type="HYBRID" style="width:600px;height:400px"

我使用谷歌地图工具。 我希望我的用户能够在地图上只放置一个标记。 坐标值应存储在托管bean变量中

我该怎么做? 看看我到目前为止做了什么:

我创建了地图:

    <f:view contentType="text/html">
            <p:gmap id="gmap" center="36.890257,30.707417" zoom="13" type="HYBRID"   
    style="width:600px;height:400px"  
    model="#{mapBean.emptyModel}"   
    onPointClick="handlePointClick(event);"   
    widgetVar="map" />  </f:view>

<p:dialog widgetVar="dlg" effect="FADE" effectDuration="0.5" close="false" fixedCenter="true">  
    <h:form prependId="false">  
        <h:panelGrid columns="2">  
            <h:outputLabel for="title" value="Title:" />  
            <p:inputText id="title" value="#{mapBean.title}" />  

            <f:facet name="footer">  
                <p:commandButton value="Add"   
                        actionListener="#{mapBean.addMarker}"   
                        update="messages"   
                        oncomplete="markerAddComplete()"/>  
                <p:commandButton value="Cancel" onclick="return cancel()"/>  
            </f:facet>  
        </h:panelGrid>  

        <h:inputHidden id="lat" value="#{newOfferSupportController.mapLocationX}" />  
        <h:inputHidden id="lng" value="#{newOfferSupportController.mapLocationY}" />  
    </h:form>  
</p:dialog>  

<script type="text/javascript">  
    var currentMarker = null;  

    function handlePointClick(event) {  
        if(currentMarker == null) {  
            document.getElementById('lat').value = event.latLng.lat();  
            document.getElementById('lng').value = event.latLng.lng();  

            currentMarker = new google.maps.Marker({  
                position:new google.maps.LatLng(event.latLng.lat(), event.latLng.lng())  
            });  

            map.addOverlay(currentMarker);  

            dlg.show();  
        }     
    }  

    function markerAddComplete() {  
        var title = document.getElementById('title');  
        currentMarker.setTitle(title.value);  
        title.value = "";  

        currentMarker = null;  
        dlg.hide();  
    }  

    function cancel() {  
        dlg.hide();  
        currentMarker.setMap(null);  
        currentMarker = null;  

        return false;  
    }  
</script>
它的工作原理与primefaces相同,但我有两个问题:

问题1:标记放置后,将无法再次放置

问题2:在地图所在的表单中,还有一些其他元素,例如文本字段。我注意到,当我点击地图所在表单中的提交按钮时,验证没有发生,实际上表单根本没有被提交(这在我添加地图之前没有发生),为什么地图会中断验证?

问题1:标记放置后,将无法再次放置

此问题由以下因素引起:

  • 您已经将纬度和经度绑定到一个不同的bean(
    NewOfferSupportController
    ),而不是保存地图模型的bean(
    MapBean
    )。您应该使用PrimeFaces showcase中的
    MapBean
    示例作为
    NewOfferSupportController
    bean的设计起点。即存储标记集。隐藏的输入必须指向该bean,因为在
    addMarker()
    方法中将添加这些值。在showcase示例中,您只需重命名
    MapBean
    类名,并通过
    {newOfferSupportController}
    重命名视图中的
    {MapBean}
    引用即可

  • 您的
    NewOfferSupportController
    bean是请求作用域,而它应该是视图作用域

    @ManagedBean
    @ViewScoped
    public class NewOfferSupportController implements Serializable {}
    
    只要您通过Ajax与同一表单交互,就可以查看作用域bean。但是请求范围的bean在每个请求上都会被重新创建(因此在每个Ajax请求上也是如此!),从而破坏了在映射中放置的标记和在添加标记之前输入的输入


  • 问题2:在地图所在的表单中,还有一些其他元素,例如文本字段。实际上表单根本没有被提交(这在我添加映射之前没有发生),为什么映射会中断验证

    这对我有用。这可能是因为您的
    NewOfferSupportController
    被放置在请求范围而不是视图范围中

    总而言之,以下是我在测试中使用的代码:

    视图:

    
    
    (我没有更改showcase示例中的
    代码,只是将其添加为未更改的代码)

    豆子:


    你看到了吗?我确实看到了。我部分实现了它,但是当我点击地图上的某个地方时,我看不到添加菜单。我做错了什么?请您在FireFox中加载页面并检查其错误控制台,我认为javascriptIt可能存在一些问题,它说:
    uncaughtTypeError:cannotsetproperty'value'为null
    错误在第151行,即(右键单击view source):
    document.getElementById('lat')。value=event.latLng.lat()
    似乎是
    document.getElementById('lat')
    返回
    null
    ,您可以在HTML源代码中看到,是否有具有此id的元素?我理解。我现在就去修,我刚修好。现在天气很好。在遵循您的说明并重构我的页面中不需要的内容后,解决了问题1和2。我已经一个多月不知道如何解决这个问题了。非常感谢:)不客气。感谢赏金。我最初没有回答,因为我以前从未使用过
    (因此我无法从头开始回答),而且我觉得不值得自己去尝试。多亏了那个给我的问题悬赏的家伙:)这也是我第一次使用
    p:gmap
    ,我开始考虑寻找替代方案,但很好,我解决了这个问题。我很高兴,我终于使这个primefaces工具如我所愿工作:)
    @ManagedBean
    @ViewScoped
    public class NewOfferSupportController implements Serializable {}
    
    @ManagedBean
    @ViewScoped
    public class MapBean implements Serializable {  
    
        private MapModel mapModel;  
        private String title;  
        private double lat;  
        private double lng;  
        private String input;
    
        public MapBean() {  
            mapModel = new DefaultMapModel();  
        }  
    
        public void addMarker(ActionEvent actionEvent) {  
            mapModel.addOverlay(new Marker(new LatLng(lat, lng), title));  
            addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marker Added", "Lat:" + lat + ", Lng:" + lng));  
        }  
    
        public void submit() {
            addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Form submitted", "Amount markers: " + mapModel.getMarkers().size() + ", Input: " + input));
        }
    
        public void addMessage(FacesMessage message) {  
            FacesContext.getCurrentInstance().addMessage(null, message);  
        }  
    
        // Getters+setters.
    }