GWT:getElementById()的JSNI函数调用返回Null

GWT:getElementById()的JSNI函数调用返回Null,gwt,jsni,Gwt,Jsni,我正在尝试使用JSNI在应用程序中显示Google地图。我已经在index.html页面中定义了脚本 以下是uibinder的定义(简而言之): 不幸的是,mapDiv为null。有人帮忙吗 我知道gwt地图和gwt-maps-v3项目。第一个只支持API的v2,gwt-maps-v3对我来说不起作用,因此采用JSNI方法。原则上,您的代码应该可以工作,我已经很快对其进行了测试(顺便说一句,它不应该与Google maps API有任何关系) 唯一重要的是,在调用initializeMap()之

我正在尝试使用JSNI在应用程序中显示Google地图。我已经在index.html页面中定义了脚本

以下是uibinder的定义(简而言之):

不幸的是,mapDiv为null。有人帮忙吗


我知道gwt地图和gwt-maps-v3项目。第一个只支持API的v2,gwt-maps-v3对我来说不起作用,因此采用JSNI方法。

原则上,您的代码应该可以工作,我已经很快对其进行了测试(顺便说一句,它不应该与Google maps API有任何关系)

唯一重要的是,在调用
initializeMap()
之前,将
添加到文档中

请尝试以下操作:

@覆盖
moduleload()上的公共void{
RootPanel.get().add(new MyUiBinderWidget());//使用map div创建小部件
初始化映射();
}

特别要注意的是,您不能从
MyUiBinderWidget
的构造函数内部调用
initializeMap()
,因为此时小部件还没有附加到文档。

@Jason:将
initializeMap()
直接放在
initWidget(…)
后面太早,无法工作。(请看我在回答中添加的最后一段。)好的,我读得太快了,删除了我的其他评论。如果我不能在构造函数中完成,那么最好的地方是哪里?@Jason:在我看来,最好的地方是在调用构造函数之后,并且小部件已经添加到文档中-就像上面的例子一样。好的,重载widget.onLoad()似乎至少填充了div,不再抛出异常。谢谢,克里斯。@Jason:将调用放入
onLoad()
一方面很好,但另一方面,它可能会引入一个棘手的错误:如果您将UiBinder小部件重新连接(即移动)到另一个父级(这是完全允许的),那么
onLoad()
将再次被调用-我想,这可能不是您想要的。
<g:HTMLPanel ui:field="mapboxV3ContentPanel">
    <!-- div for display of the actual map -->
    <div id="map"><!-- --></div>
</g:HTMLPanel>
private native void initializeMap() /*-{

    var latLng = new $wnd.google.maps.LatLng(-34.397, 150.644);
    var mapOptions = {
        zoom: 8,
        center: latLng,
        mapTypeId: $wnd.google.maps.MapTypeId.ROADMAP
    };
    var mapDiv = $doc.getElementById('map');
    if (mapDiv==null) {
        alert("MapDiv is null!");
    }
    var map = new $wnd.google.maps.Map(mapDiv, mapOptions);
}-*/;