2015-01-08 5 views
1

Я использую GWT вместе с API GoogleGaps GWT (v3.8, и нет, я не могу использовать API-интерфейсы для отрубей GoogleMaps).DataGrid внутри InfoWindow не отображает данные таблицы

Я пытаюсь поместить таблицу DataGrid внутри InfoWindow на карте. У меня есть DataGrid работает отлично, пока я показываю его за пределами карты, но всякий раз, когда я добавить DataGrid внутри InfoWindow, ни одна из строк таблицы не отображаются:

enter image description here

Если я правая кнопка мыши InfoWindow , переходите к «проверке элемента», а затем тащитесь через миллионы div, которые создает GWT, я вижу, что данные есть, по какой-то причине это просто не видно.

Я сделал довольно много поискового запроса, но все, что я видел, это то, что DataGrid должен быть дочерним элементом LayoutPanel или ScrollPanel. Но это именно то, что я делаю:

package com.test.client; 

import java.util.Arrays; 

import com.google.gwt.ajaxloader.client.AjaxLoader; 
import com.google.gwt.ajaxloader.client.AjaxLoader.AjaxLoaderOptions; 
import com.google.gwt.cell.client.TextCell; 
import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.dom.client.Document; 
import com.google.gwt.user.cellview.client.Column; 
import com.google.gwt.user.cellview.client.DataGrid; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.user.client.ui.ScrollPanel; 
import com.google.maps.gwt.client.GoogleMap; 
import com.google.maps.gwt.client.InfoWindow; 
import com.google.maps.gwt.client.InfoWindowOptions; 
import com.google.maps.gwt.client.LatLng; 
import com.google.maps.gwt.client.MapOptions; 
import com.google.maps.gwt.client.MapTypeId; 

public class GwtTest implements EntryPoint { 

    @Override 
    public void onModuleLoad() { 
     AjaxLoaderOptions options = AjaxLoaderOptions.newInstance(); 
     options.setOtherParms("sensor=false"); 
     Runnable callback = new Runnable() { 
      public void run() { 
       createMap(); 
      } 
     }; 
     AjaxLoader.loadApi("maps", "3", callback, options); 

     //this works 
     DataGrid dg = createTable(); 
     RootPanel.get("tableDiv").add(new ScrollPanel(dg)); 
    } 

    public void createMap() { 

     MapOptions mapOpts = MapOptions.create(); 
     mapOpts.setZoom(4); 
     mapOpts.setCenter(LatLng.create(37.09024, -95.712891)); 
     mapOpts.setMapTypeId(MapTypeId.TERRAIN); 
     mapOpts.setStreetViewControl(false); 

     GoogleMap map = GoogleMap.create(Document.get().getElementById("map_canvas"), mapOpts); 

     DataGrid dg = createTable(); 

     InfoWindowOptions iwo = InfoWindowOptions.create(); 
     iwo.setPosition(LatLng.create(37.09024, -95.712891)); 
     iwo.setContent(new ScrollPanel(dg).getElement()); 

     InfoWindow infoWindow = InfoWindow.create(iwo); 
     infoWindow.open(map); 
    } 

    public DataGrid createTable(){ 
     Column columnA = new Column(new TextCell()){ 
      public Object getValue(Object object) { 
       return "one"; 
      } 
     }; 

     Column columnB = new Column(new TextCell()){ 
      public Object getValue(Object object) { 
       return "two"; 
      } 
     }; 

     Column columnC = new Column(new TextCell()){ 
      public Object getValue(Object object) { 
       return "three"; 
      } 
     }; 

     DataGrid dataGrid = new DataGrid(); 
     dataGrid.addColumn(columnA, "A"); 
     dataGrid.addColumn(columnB, "B"); 
     dataGrid.addColumn(columnC, "C"); 

     dataGrid.setRowCount(1); 
     dataGrid.setRowData(Arrays.asList("one", "two", "three")); 

     dataGrid.setWidth("200px"); 
     dataGrid.setHeight("100px"); 

     return dataGrid; 
    } 
} 

Есть ли какой-то шаг, который мне не хватает? Как я могу получить DataGrid для правильного отображения внутри InfoWindow с помощью API GoogleMaps?

Редактировать: После того как вы не получили никаких ответов, я перекрестил этот вопрос на доске объявлений GWT here.

+0

ли форматирование InfoWindow иначе изменить что-нибудь? – Andy

+0

@ Энди Спасибо за ответ. Что именно вы имеете в виду, форматируя мой InfoWindow по-другому? –

+0

К сожалению, я имел в виду настройку содержимого на что-то еще, возможно, определение с помощью html. Хотя я думаю, если вам это нужно как прокручиваемое, это может быть бессмысленно. – Andy

ответ

1

Если кто-то приходит через эту проблему, я в конечном итоге только с помощью CellTable вместо:

package com.test.client; 

import java.util.Arrays; 

import com.google.gwt.ajaxloader.client.AjaxLoader; 
import com.google.gwt.ajaxloader.client.AjaxLoader.AjaxLoaderOptions; 
import com.google.gwt.cell.client.TextCell; 
import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.dom.client.Document; 
import com.google.gwt.user.cellview.client.CellTable; 
import com.google.gwt.user.cellview.client.Column; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.user.client.ui.ScrollPanel; 
import com.google.maps.gwt.client.GoogleMap; 
import com.google.maps.gwt.client.InfoWindow; 
import com.google.maps.gwt.client.InfoWindowOptions; 
import com.google.maps.gwt.client.LatLng; 
import com.google.maps.gwt.client.MapOptions; 
import com.google.maps.gwt.client.MapTypeId; 

public class GwtTest implements EntryPoint { 

    @Override 
    public void onModuleLoad() { 
     AjaxLoaderOptions options = AjaxLoaderOptions.newInstance(); 
     options.setOtherParms("sensor=false"); 
     Runnable callback = new Runnable() { 
      public void run() { 
       createMap(); 
      } 
     }; 
     AjaxLoader.loadApi("maps", "3", callback, options); 

     //this works 
     CellTable dg = createTable(); 
     RootPanel.get("tableDiv").add(new ScrollPanel(dg)); 
    } 

    public void createMap() { 

     MapOptions mapOpts = MapOptions.create(); 
     mapOpts.setZoom(4); 
     mapOpts.setCenter(LatLng.create(37.09024, -95.712891)); 
     mapOpts.setMapTypeId(MapTypeId.TERRAIN); 
     mapOpts.setStreetViewControl(false); 

     GoogleMap map = GoogleMap.create(Document.get().getElementById("map_canvas"), mapOpts); 

     CellTable dg = createTable(); 


     InfoWindowOptions iwo = InfoWindowOptions.create(); 
     iwo.setPosition(LatLng.create(37.09024, -95.712891)); 
     iwo.setContent(dg.getElement()); 

     InfoWindow infoWindow = InfoWindow.create(iwo); 
     infoWindow.open(map); 

    } 

    public CellTable createTable(){ 
     Column columnA = new Column(new TextCell()){ 

      @Override 
      public Object getValue(Object object) { 
       return "one"; 
      } 

     }; 

     Column columnB = new Column(new TextCell()){ 

      @Override 
      public Object getValue(Object object) { 
       return "two"; 
      } 

     }; 

     Column columnC = new Column(new TextCell()){ 

      @Override 
      public Object getValue(Object object) { 
       return "three"; 
      } 

     }; 

     CellTable dataGrid = new CellTable(); 
     dataGrid.addColumn(columnA, "A"); 
     dataGrid.addColumn(columnB, "B"); 
     dataGrid.addColumn(columnC, "C"); 

     dataGrid.setRowCount(1); 
     dataGrid.setRowData(Arrays.asList("one", "two", "three")); 

     dataGrid.setWidth("200px"); 
     dataGrid.setHeight("100px"); 

     return dataGrid; 
    } 
} 
0

Вам необходимо использовать RootLayoutPanel в onModuleLoad вместо RootPanel. Там должны быть панели макета от корня до DataGrid. InfoWindow не кажется, панель макета, так что вам, возможно, потребуется подключить изменения размера себя, см:

http://www.gwtproject.org/doc/latest/DevGuideUiPanels.html#Resize

Кроме того, вы положили DataGrid внутри scrollpanel. Вы можете это сделать, но тогда вы должны дать ему явный размер. DataGrid имеет свою собственную панель прокрутки, поэтому вы, возможно, также можете избавиться от явно созданного.

Смежные вопросы