我认为这是google map的GWT绑定的map 3.8.0预发行版中的一个错误,但在走这条路之前,我想我会和大家核实一下。当我创建一个地图,然后尝试将新创建的地图面板/小部件添加到包含面板中时,我会得到一个异常。如果我在一个包装现有htmldiv的面板中创建映射,它会毫无例外地显示,但无论哪种方式,如果它在html中有div或没有div,如果我试图将其添加到任何其他面板,它都会抛出异常。
它通常抛出的异常是:
gwt-google-apis gwt-map-3.8.0-pre throws JavaScriptException 'map' is not defined.
我还有其他例外,但让我们暂时忽略这些,除非它们变得相关。
以下是我获得图书馆的链接:http://code.google.com/p/gwt-google-apis/downloads/detail?name=gwt-maps-3.8.0-pre1.zip&can=2&q=
顺便说一句,我用java1.5编译器重新编译了原始源代码,但我没有做任何更改。
作为后台,我正在移植一个为谷歌地图v2到v3编写的应用程序。在当前的生产版本中,MapWidget对象被添加到一个VerticalPanel(即html表)中,该表被添加到另一个Vertical Panel中。。。最终通过门户提供服务。如果我必须改变这个结构,这将是一个更广泛的重写,所以我很感激你能提供任何见解。
我在这个主题上尝试了很多变体,结果都很相似。很多时候,地图会显示出来,但会变灰,然后如果你通过控件与地图交互,它通常会自行排序,有时不会。无论是IE-8还是firefox似乎都无关紧要。
我的代码如下:
LatLng myLatLng = LatLng.create(39.571993, -104.998184);
MapOptions myOptions = MapOptions.create();
myOptions.setZoom(16.5);
myOptions.setCenter(myLatLng);
myOptions.setMapTypeId(MapTypeId.SATELLITE);
//com.google.gwt.dom.client.Element mapDiv = Document.get().getElementById("map_canvas");
RootPanel root = RootPanel.get("MAP1_NetworkMapContainer");
//HTMLPanel mapPanel = HTMLPanel.wrap(mapDiv);
//mapPanel.setHeight("100%");
//map = GoogleMap.create(mapPanel.getElement(), options);
try {
root.add(mapPanel);
} catch (Exception e) {
Log.error("Received Exception ", e);
String error = e.toString();
}
作为一个小工具,也就是在3.0.2 的源代码中完成的方式
public class MapWidget extends Widget {
final private static String EXCEPTION_NOT_ATTACHED
= "Map widget must be attached to window's document.";
private GoogleMap map;
public MapWidget(MapOptions options) {
setElement(Document.get().createDivElement());
map = GoogleMap.create(getElement(), options);
}
作为SimplePanel 的扩展
public class MapPanel extends SimplePanel {
final private static String EXCEPTION_NOT_ATTACHED
= "Map Panel must be attached to window's document.";
private GoogleMap map;
public MapPanel(MapOptions options) {
map = GoogleMap.create(getElement(), options);
}
结果总是一样的。如果我的GWT小部件在HTML中有一个div的元素id,它会显示OK,但如果我尝试添加创建的div或HTMLdiv的结果,然后将其附加到根面板,它会抛出异常。它是根面板还是任何其他类型的面板似乎都无关紧要。我将mapPanel添加到其中。
我已经开始使用这个库:就我所做的而言,它是有效的。
以下是我的做法:
public class MyMapWidget extends Composite {
interface MyMapWidgetUiBinder
extends UiBinder<Widget, MyMapWidget> {}
private static MyMapWidgetUiBinder uiBinder =
GWT.create(MyMapWidgetUiBinder.class);
@UiField FlowPanel mapContainer;
private GoogleMap map;
...
public MyMapWidget() {
initWidget(uiBinder.createAndBindUi(this));
MapOptions opts = MapOptions.create();
opts.setScaleControl(true);
// add your map options
...
opts.setCenter(LatLng.create(44.1, 0.2);
opts.setZoom(8.0);
map = GoogleMap.create(mapContainer.getElement(), opts);
...
}
在相应的UiBinder XML文件中,我有
<g:FlowPanel ui:field="mapContainer" width="500px" height="350px" />
我从来没能让它与预发行版1的绑定一起工作。我切换到了这里的第三方绑定:谷歌地图V3
在这个问题被搁置的2.5年里,被迫退出v2的最后期限迫在眉睫,我怀疑GWT团队是否会提供解决方案。
我在GWT网站上创建了一个问题,您可能想在那里查看更新,或者如果这影响到您,请投票支持它。发行504