2

gwt-google-apisの新しいmapsv3APIを使用しています。

インフォウィンドウ内にあるGWTウィジェットからイベントをキャプチャすることは可能ですか?私は何かが足りないのですか?

上記のコード(button.addClickHandler)を試しましたが、アラートが表示されません:

    Marker m = Marker.create();
    m.setIcon(MarkerImage.create(icone));
    m.setPosition(LatLng.create(posicao.lat(), posicao.lng()));
    m.setMap(map);

    m.addClickHandler(new ClickHandler() {

        @Override
        public void handle(MouseEvent event) {

            InfoWindow info = InfoWindow.create();

            Button button = new Button("Desativar");
            button.addClickHandler(new com.google.gwt.event.dom.client.ClickHandler() {

                @Override
                public void onClick(ClickEvent event) {
                    Window.alert("click");

                }
            });

            final HTMLPanel html = new HTMLPanel(("<div id='button'></div>"));
            html.add(button, "button");

            info.setContent(html.getElement());
            info.setPosition(posicao);
            info.open(map);

        }
    });

ありがとう。

4

2 に答える 2

2

この問題は、ウィジェット間の壊れた階層の結果です。これを行う通常の方法は、ウィジェットをアタッチ/デタッチすることです。ウィジェットの要素を設定することでそれを行います。これは Google Maps API の問題でもあります。

これは、 の一部となるフェイク パネルを使用することで解決できますInfoWindow。したがって、フェイク パネルを作成するとsetContent(Widget widget)、フェイク パネルが更新され、ウィジェットの要素がコンテンツに設定されます (以前のように)。

このクラスを見てください:

public class MyInfoWindow extends InfoWindow {

  static class FakePanel extends ComplexPanel {
    public FakePanel(Widget w) {
      w.removeFromParent();
      getChildren().add(w);
      adopt(w);
    }

    @Override
    public boolean isAttached() {
      return true;
    }

    public void detachWidget() {
      this.remove(0);
    }
  }

  private IsWidget widgetContent = null;

  FakePanel widgetAttacher;

  public MyInfoWindow() {
    super(InfoWindowImpl.impl.construct());
  }

  private void detachWidget() {
    if (this.widgetAttacher != null) {
      this.widgetAttacher.detachWidget();
      this.widgetAttacher = null;
    }
  }

  public void close() {
    super.close();
    detachWidget();
  }

  public void setContent(String content) {
    this.widgetContent = null;
    this.detachWidget();
    super.setContent(content);
  }

  /** */
  public void setContent(Widget value) {
    this.widgetContent = value;
    setContent(value.getElement());

    if (this.widgetAttacher == null) {
      addListener(getJso(), "closeclick", new Runnable() {
        @Override
        public void run() {
          detachWidget();
        }
      });
      this.widgetAttacher = new FakePanel(value);
    } else if (this.widgetAttacher.getWidget(0) != value) {
      this.widgetAttacher.detachWidget();
      this.widgetAttacher = new FakePanel(value);
    }
  }

  private void setContent(Element element) {
    InfoWindowImpl.impl.setContent(getJso(), element);
  }

  public IsWidget getContentWidget() {
    return widgetContent;
  }

  public final native void addListener(JavaScriptObject jso, String whichEvent, Runnable handler)
  /*-{
    var that = jso;
    $wnd.google.maps.event.addListener(jso, whichEvent, function() {
      handler.@java.lang.Runnable::run()();
    });
  }-*/;

}
于 2012-07-18T12:57:18.220 に答える
1

InfoWindow を機能させるには、ラッパーを作成する必要がありました。

public class NXInfoWindow {

    static class FakePanel extends ComplexPanel {
        public FakePanel(Widget w) {
            w.removeFromParent();
            getChildren().add(w);
            adopt(w);
        }

        @Override
        public boolean isAttached() {
            return true;
        }

        public void detachWidget() {
            this.remove(0);
        }
    }

    private InfoWindow info;

    private IsWidget widgetContent = null;

    private Long id;

    FakePanel widgetAttacher;

    public static NXInfoWindow create(Long id){
        NXInfoWindow myInfo = new NXInfoWindow();
        myInfo.info = InfoWindow.create(); 
        myInfo.id = id;
        return myInfo;
    };

    private void detachWidget() {
        if (this.widgetAttacher != null) {
            this.widgetAttacher.detachWidget();
            this.widgetAttacher = null;
        }
    }

    public void close() {
        info.close();
        detachWidget();
    }

    public void setPosition(LatLng posicao) {
        info.setPosition(posicao);
    }

    public void open(GoogleMap map) {
        info.open(map);
    }

    public void setContent(Widget value) {
        this.widgetContent = value;
        info.setContent(value.getElement());

        if (this.widgetAttacher == null) {
            addListener(info, "closeclick", new Runnable() {
                @Override
                public void run() {
                    detachWidget();
                }
            });
            this.widgetAttacher = new FakePanel(value);
        } else if (this.widgetAttacher.getWidget(0) != value) {
            this.widgetAttacher.detachWidget();
            this.widgetAttacher = new FakePanel(value);
        }
    }

    private void setContent(Element element) {
        this.setContent(element);
    }

    public IsWidget getContentWidget() {
        return widgetContent;
    }

    public final native void addListener(JavaScriptObject jso, String whichEvent, Runnable handler)
    /*-{
        var that = jso;
        $wnd.google.maps.event.addListener(jso, whichEvent, function() {
          handler.@java.lang.Runnable::run()();
        });
      }-*/;
}
于 2012-07-18T20:06:14.413 に答える